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 };
在類定義時,已指向自身類型的指針或引用作為數據成員則沒有問題。按照前面的介紹就很好理解了,由於指針和引用所占存儲空間大小與類型無關,所以編譯器可以計算分配空間,所以正確。
還看到一個從對象構造過程的角度解釋這個問題的答案,貼在這里:(原網頁鏈接為參考資料的第二個)
因為如果類包含自身類的對象,存在無限初始化的問題。
構造一個類的對象是,先構造成員變量,然后再調用自身的構造函數,如果類包含自身的的對象,那么在調用構造函數之前,需要先構造自身類的對象。而構造自身類的對象時,又得先構造自身的對象,然后調用其構造函數……
