目錄
- this引入
-
- 總結this
- const成員函數
-
- 能const構造函數嗎
this引入
假設我們有這樣一個類:
class Sales_Data
{
public:
string isbn() const { return BookNo; }
private:
string BookNo;
};
定義類對象total:
Sales_Data total
。
那麼total.isbn()是如何做到傳回total的資料成員BookNo的?
實際上,
類的成員函數有一個隐式的參數,這個隐式的參數就是this指針
。是以,在類對象調用成員函數時,會把類對象位址傳入成員函數,即total.isbn()可看作是total.isbn(&total)。
當isbn()使用BookNo時,實際上隐式的使用this指向對象的BookNo資料成員,即return BookNo實際上是return this->BookNo。
總結this
下面我總結一下this及它的一些其他用法:
- this 實際上是類所有成員函數(靜态成員函數和友元函數除外)的一個形參,在類對象調用成員函數時,将對象的位址傳給 this。是以this代表目前對象。
- 一個對象的this指針并不是對象本身的一部分,
。不會影響sizeof(對象)的結果
-
。而這些被編譯成普通函數的成員函數一定有一個this的形參,用于辨別某具體類對象,作為成員函數和成員變量關聯的橋梁。一個類的大小僅僅是資料成員的大小,所有成員函數均被編譯成普通函數
- 當成員函數的參數與類的資料成員名相同時,要用this指派,如this->BookNo = BookNo (不要寫成BookNo = BookNo ,盡管不報錯,但達不到目的)。
const成員函數
預設情況下,this是一個常量指針,如,引例中this就是Sales_Data *const類型。在某種情況下,成員函數不改變資料成員的内容,把this指針聲明為指向常量的常量指針有助于提高函數的靈活性和易讀性。
但是由于this是隐式的,我們無法指向修改其類型,C++的做法是允許在類的成員函數的參數清單後面加上一個const,如引例中string isbn() const,此時isbn是無法修改調用它的類對象的資料成員的,而這樣的使用const的成員函數就是常量(const)成員函數。
這裡注意:
- 對于常量對象、常量對象的引用和常量對象的指針,它們隻能調用常量成員函數。原因很簡單,常量是不能改變的,如果它們可以調用非常量成員函數,而非常量成員函數是可以改變對象資料成員的。這就有沖突,C++不允許。
能const構造函數嗎
- 首先,
原因很簡單,構造函數是用來初始化資料成員的。對于構造函數,不能聲明為const。
-
其次,在前面說到,常量對象是隻能調用常量成員函數的,這是不是意味着常量對象不能使用構造函數初始化了?非也,其實,當我們建立一個常量對象時,在調用構造函數初始化結束後,對象才真正被賦予常量屬性。
總結:
- 常量成員函數無法改變資料成員
- 常量對象、常量對象的引用和常量對象的指針,它們隻能調用常量成員函數
- 構造函數不能聲明為const