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