天天看點

this和const成員函數。能const構造函數嗎?(C++)this引入const成員函數

目錄

  • 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及它的一些其他用法:

  1. this 實際上是類所有成員函數(靜态成員函數和友元函數除外)的一個形參,在類對象調用成員函數時,将對象的位址傳給 this。是以this代表目前對象。
  2. 一個對象的this指針并不是對象本身的一部分,

    不會影響sizeof(對象)的結果

  3. 一個類的大小僅僅是資料成員的大小,所有成員函數均被編譯成普通函數

    。而這些被編譯成普通函數的成員函數一定有一個this的形參,用于辨別某具體類對象,作為成員函數和成員變量關聯的橋梁。
  4. 當成員函數的參數與類的資料成員名相同時,要用this指派,如this->BookNo = BookNo (不要寫成BookNo = BookNo ,盡管不報錯,但達不到目的)。

const成員函數

預設情況下,this是一個常量指針,如,引例中this就是Sales_Data *const類型。在某種情況下,成員函數不改變資料成員的内容,把this指針聲明為指向常量的常量指針有助于提高函數的靈活性和易讀性。

但是由于this是隐式的,我們無法指向修改其類型,C++的做法是允許在類的成員函數的參數清單後面加上一個const,如引例中string isbn() const,此時isbn是無法修改調用它的類對象的資料成員的,而這樣的使用const的成員函數就是常量(const)成員函數。

這裡注意:

  • 對于常量對象、常量對象的引用和常量對象的指針,它們隻能調用常量成員函數。原因很簡單,常量是不能改變的,如果它們可以調用非常量成員函數,而非常量成員函數是可以改變對象資料成員的。這就有沖突,C++不允許。

能const構造函數嗎

  1. 首先,

    對于構造函數,不能聲明為const。

    原因很簡單,構造函數是用來初始化資料成員的。
  2. 其次,在前面說到,常量對象是隻能調用常量成員函數的,這是不是意味着常量對象不能使用構造函數初始化了?非也,其實,當我們建立一個常量對象時,在調用構造函數初始化結束後,對象才真正被賦予常量屬性。

總結:

  1. 常量成員函數無法改變資料成員
  2. 常量對象、常量對象的引用和常量對象的指針,它們隻能調用常量成員函數
  3. 構造函數不能聲明為const