為什么C++類定義中,數據成員不能被指定為自身類型,但可以是指向自身類型的指針或引用?為什么在類體內可以定義將靜態成員聲明為其所屬類的類型呢 ?


static的成員變量,不是存儲在Bar實例之中的,因而不會有遞歸定義的問題

類聲明:

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 };

 

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM