先明確幾個概念:
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()
int getvalue()
int getvalue()const
private:
int mvalue;
};
void test(a & const a)
int main()
由於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指標只能在類中使用)
常物件與常成員函式
常物件的宣告形式 必須進行初始化,不能被更新 const 類名 物件名 常引用 被引用的物件不能被更新 const 型別說明符 引用名 常陣列 陣列元素不能被更新 型別說明符 const 陣列名 大小 常指標 指向常量的指標,指向的內容不能通過該指標改變,但可以改變指向的物件 const 型別說明符...
常成員,常函式,常物件
知識點1.常物件中的任何型別的資料成員 無論私有還是公有 的值都不能被改變。知識點2.常物件能呼叫的 1.公有的常成員函式 2.建構函式 3.公有的靜態函式 知識點3.常物件與常成員函式只有同時存在才都有意義 知識點4.普通物件既可以呼叫常成員函式,也可以呼叫非常成員函式 知識點5.常成員函式不能更...
常物件,常成員函式,常引用
宣告顯示 const 型別說明符 物件名 常物件的資料成員值在物件的整個生存期間不能被改變,即就是,常物件必須進行初始化,而且不能被更新。宣告形式 型別說明符 函式名 參數列 const 注意 1.在函式定義部分也需要帶const關鍵字。2.乙個常物件只能呼叫它的常成員函式,是常物件唯一的對外介面方...