const物件只能呼叫const成員函式

2021-09-25 06:03:59 字數 1107 閱讀 3558

假設現在有如下**:

class

test

;

test obj1(12

);obj1.

print()

;

物件呼叫成員函式時,在形參列表的最前面加乙個形參this,但這是隱式的。this指標是預設指向呼叫函式的當前物件的,所以,很自然,this是乙個常量指標test * const,因為不可以修改this指標代表的位址。

但當成員函式的引數列表(即小括號)後加了const關鍵字(void print() const;),此成員函式為常量成員函式,此時它的隱式this形參為const test * const,即不可以通過this指標來改變指向物件的值。這就是「常量成員函式可讀取類中的資料成員,但不能修改」的原因。

和python有點像,在定義類的函式時,每個函式的引數列表的第乙個引數必須為self,這個用法和c++裡的隱式this應該是一樣的。

obj1.print();這一句其實相當於obj1.print(&obj1);

當物件為const物件時,即const test obj1(12)時,實參的型別為const test *;當print為常量成員函式時,形參this的型別為const test * const。轉換時加了個頂層const,是可以的。所以const物件可以呼叫const成員函式。

當物件為const物件時,即const test obj1(12)時,實參的型別為const test *;當print為非常量成員函式時,形參this的型別為test * const。轉換時會丟失底層const,這是不可以的。所以const物件不可以呼叫非const成員函式。

當物件為非const物件時,const成員函式和非const成員函式都可以呼叫。分析過程類似,反正實參的型別為test *,怎麼轉換都不可能出現丟失底層const這種情況啦。

讓物件只能由乙個執行緒呼叫

原來系統中有人寫了乙個鎖住物件的類,他用乙個字典,對每乙個使用者操作,字典中先新增物件的id為key,value為new object。並希望用monitor鎖住obj來實現同步。我寫了類似的測試 public static class mylock public static void lock ...

類只能生成棧物件(或只能生成堆物件)

將運算子new delete進行過載,並放到private區域中,這樣就不能通過new建立類的堆物件了。include include include using std cout using std endl class student student student student studen...

const物件和const函式

當乙個類的函式的參數列不同時,能過載函式,當函式的const性不同時,也能過載函式。如下所示 include a.h 定義了ca類 class cbigclass const ca getvalue const ca getvalue private ca m value 客戶端 如下 ca ca ...