先明確幾個概念:
1. 常物件只能呼叫常成員函式。
2. 普通物件可以呼叫全部成員函式。
3. 當對乙個物件呼叫成員函式時,編譯程式先將物件的位址賦給this指標,然後呼叫成員函式,每次成員函式訪問資料成員時,由隱含使用this指標。
4. 當乙個成員函式被呼叫時,自動向它傳遞乙個隱含的引數,該引數是乙個指向這個成員函式所在的物件的指標。
5. 在c++中,this指標被隱含地宣告為: x *const this,這意味著不能給this 指標賦值;
在x類的const成員函式中,this指標的型別為:const x* const, 這說明this指標所指向的這種物件是不可修改的(即不能對這種物件的資料成員進行賦值操作);
6. 由於this並不是乙個常規變數,所以,不能取得this的位址。
如:[cpp]
view plain
copy
#include
class
a
void
print()
intgetvalue()
intgetvalue()
const
private
: int
mvalue;
};
void
test(a &
const
a)
intmain()
由於a是const物件,所以a只能呼叫類a中的常成員函式。
因為對於c++的成員函式(當然不是靜態成員函式),都會含有乙個隱藏的引數,對於上例a中的int getvalue()函式,在編譯後會變成:
int getvalue(a * const this); //不能修改this變數,但可以修改this指向的內容,即:this是常量指標。
而對於int getvalue()const ,編譯後是:
int getvalue(const a* const this);
只所以this指標是const型別,因為在某次呼叫整個過程this指向都不允許改變(原因很簡單,如果改變的話就不是這個物件呼叫的了)
從編譯後的結果看就很清楚了, 因為a是const,所以其this指標就對應: const a* const this ;
而print函式被編譯出來後對應的是void print(a* const this); 在進行引數匹配時, 所以就會提示 「不能將「this」指標從「const a ....."
this指標的出現就解釋了,所有類a的物件都是公用一套**模版,為什麼各個物件在呼叫成員函式的時候不會亂套。
原來c++為成員函式提供了乙個名字為this的指標,這個指標稱為自引用指標。
每當建立乙個物件時,系統就把this指標初始化為指向該物件
。每當呼叫乙個成員函式時,系統就自動把this指標作為乙個隱含的引數傳給該函式。不同的物件呼叫同乙個成員函式時,c++編譯器將根據成員函式this指標所指向的物件來確定應該引用哪乙個物件的資料成員。通常情況下,this指標是隱含存在的,也可以將其顯示的表示出來(即如上例中的 this->mvalue。不過this指標只能在類中使用)
還有就是 this指標是乙個
const指標
,不能再程式中修改它或給它賦值;
c 常成員函式 和 常物件
先明確幾個概念 1.常物件只能呼叫常成員函式。2.普通物件可以呼叫全部成員函式。3.當對乙個物件呼叫成員函式時,編譯程式先將物件的位址賦給this指標,然後呼叫成員函式,每次成員函式訪問資料成員時,由隱含使用this指標。4.當乙個成員函式被呼叫時,自動向它傳遞乙個隱含的引數,該引數是乙個指向這個成...
常成員,常函式,常物件
知識點1.常物件中的任何型別的資料成員 無論私有還是公有 的值都不能被改變。知識點2.常物件能呼叫的 1.公有的常成員函式 2.建構函式 3.公有的靜態函式 知識點3.常物件與常成員函式只有同時存在才都有意義 知識點4.普通物件既可以呼叫常成員函式,也可以呼叫非常成員函式 知識點5.常成員函式不能更...
C 之常物件,常成員物件,常成員函式,常指標
一 常物件 time const t1 12,23,23 其中所有的值不能被修改。通過該物件只能呼叫它的常成員函式,而不能呼叫它的普通成員函式。以防普通成員函式會修改資料成員的值。但如果一定要修改常物件資料成員的值,可以將該資料成員宣告為mutable,如 mutable int count 把co...