c 常成員函式 和 常物件

2021-08-20 11:08:26 字數 1609 閱讀 4846

先明確幾個概念:

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...