C++中常對象與常成員函數以及this與成員函數的聯繫與區別

class A
{
};
/*

小記:對於const聲明的對象,針對哪個變哪個不變得問題,實際上就是const後的整體不變
e.g.:
const int *A; 或 int const *A; //const修飾指向的對象,A可變,A指向的對象不可變
int *const A;   //const修飾指針A, A不可變,A指向的對象可變
const int *const A; //指針A和A指向的對象都不可變

*/
1. 常對象
用const修飾的對象叫對象常量,其格式如下:〈類名〉const 〈對象名〉 或者 const 〈類名〉〈對象名〉
聲明爲常對象的同時必須被初始化,並從此不能改寫對象的數據成員。
常對象只能調用常成員函數,而非常對象既可以調用非常成員函數又可以調用常成員函數
2. 常成員函數
常成員函數含義是通過該函數只能讀取同一類中的數據成員的值,而不能修改它(在const成員函數中: 可以修改被定義成mutable的成員變量或者靜態成員變量(因爲成員函數一般針對對象而言,而靜態的成員是對類而言的))。C語言中,volatile
其格式如下:〈類型〉〈函數名〉(〈參數表〉)const;
常成員函數不能更新對象的數據,也不能調用非const修飾的成員函數。常對象只能調用類的常成員函數。總之,常成員函數不能夠以任何方式改變數據成員對的值,包括直接(函數體自身),間接(調用其他的非常成員函數來改變)均是錯誤的。
說明:
(1) const是函數類型的一部分,在實現部分也要帶該關鍵字。
(2) const關鍵字可以用於對重載函數的區分。(常對象只能調用常成員函數,注意當出現函數重載時,一個非常對象(一般對象)首先調用非常成員函數,如果不存在重載的非常成員函數,那麼它會調用常成員函數)
(3) 常成員函數不能更新類的成員變量,也不能調用該類中沒有用const修飾的成員函數,只能調用常成員函數。
(4) 常成員函數只能調用常成員函數,而不能調用非常成員函數(那怕這個非常成員函數沒有對數據成員進行更改),但是常成員函數可以被非常成員函數調用

任何不修改成員數據的函數都應該聲明爲const函數,這樣有助於提高程序的可讀性和可靠性

構造函數和析構函數對這個規則例外,它們從不定義爲常量成員,但可被常量對象調用(被自動調用)


    對於某個類的所有對象來說,類成員函數只在內存中有一份拷貝,所有的對象都共享同一份成員函數的代碼。同一個類的不同的對象之間的差異僅僅是通過數據成員來體現的。c++實現成員函數的時候實際上用到了一個技巧——this指針。this指針是當前調用成員函數的對象首地址,我們知道通過這個地址可以訪問到對應對象的成員變量。那麼成員函數如何區分this究竟指向哪個對象呢?技巧就在於,c++背後把成員函數當做普通函數一樣調用,除了傳入實際的參數外,還把所屬對象的指針作爲參數this傳入,函數內部通過顯示的或者隱含的方式訪問對象成員(注意如果成員函數的形參與對象的數據成員的變量名一樣,那麼只能夠顯式使用this指針來區別形參,以此表示是當前對象的數據成員,否則將引用的是這個成員函數的形參)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章