爲什麼C++類定義中,數據成員不能被指定爲自身類型,但可以是指向自身類型的指針或引用?

在介紹這個問題前,我們先簡要說一下類定義和聲明的區別。

類聲明:

class Screen;   //Screen類的聲明

類定義:

class Screen{    //Screen類的定義
    //etc...
};       

當用實例化一個類的對象時,編譯器會根據類的定義來分配相應的存儲空間。也就是說,在創建對象前,一定要有完整的類定義,這樣編譯器才能正確的計算所需空間。

那麼我們來看如下代碼:

class Screen{
    Screen sc;    //error, 'sc' uses undefined class 'Screen'
    //etc...
};

上述代碼中,由於Screen還沒有定義結束,在內部定義一個Screen類型的對象時,編譯器無法知道應該爲sc分配多少空間,因此會報註釋中的錯誤。

我們再看下面一段代碼:

class Screen{
    Screen *sc1;   //ok
    Screen &sc2;   //ok
};

在類定義時,已指向自身類型的指針或引用作爲數據成員則沒有問題。按照前面的介紹就很好理解了,由於指針和引用所佔存儲空間大小與類型無關,所以編譯器可以計算分配空間,所以正確。

還看到一個從對象構造過程的角度解釋這個問題的答案,貼在這裏:(原網頁鏈接爲參考資料的第二個)

因爲如果類包含自身類的對象,存在無限初始化的問題。
構造一個類的對象是,先構造成員變量,然後再調用自身的構造函數,如果類包含自身的的對象,那麼在調用構造函數之前,需要先構造自身類的對象。而構造自身類的對象時,又得先構造自身的對象,然後調用其構造函數……

參考資料:
爲什麼類的定義中不能包含其自身類型,但是能包含其自身的指針或引用類型
c++編程,爲什麼自身類的對象不可以作爲該類的成員,自身類的指針或引用卻可以?

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