假設現在有如下**:
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 ...