2012-03-12 16 views
0

可能重複:
Why is a class allowed to have a static member of itself, but not a non-static member?我們如何能夠在與類相同的數據類的類中聲明一個靜態成員?

這是無效的代碼

struct a{ 
    a mem; //Invalid as the compiler does not know how much memory to allocate 
    }; 

但這是有效的:

class Date{ 
    int d,m,y; 
    static Date Default_date; //Valid 
}; 

如何編譯器能夠在這裏知道在這個Date數據類型沒有被正確定義之前要分配多少內存!

這是否與其他靜態定義有所不同?

+0

當*聲明*靜態成員時,編譯器無法知道Date有多大。但想一想 - 在這一點上它不需要知道它。 – 2012-03-12 10:42:35

+0

I ** guess **編譯器不會爲那裏的靜態變量(然後INSIDE類)分配內存,但是它將在聲明時分配內存。例如字段必須知道聲明時類型本身的大小。我認爲這可能是由編譯器(我不知道他們沒有)沒有太多的努力,我想編譯器大師會來解釋... – 2012-03-12 10:46:32

回答

7

靜態成員不存儲在類內部,所以它的大小不會影響類的總大小。

您必須在其他位置定義靜態成員,也許在.cpp文件中。那時編譯器必須知道類的大小。

5

在第一種情況下,它是無效的,因爲它是一個無限大小的遞歸結構。 在第二種情況下可以,因爲實際內存分配發生在聲明後。

1

您只能在類聲明,其大小在這一點上,即爲誰定義已經存在,被稱爲使用數據成員。編譯器需要知道類實例在聲明時聲明的內存量是多少。你可以使用指針和引用類型,你[轉] - 聲明(這些有你的操作系統的無論多少位)。

一個聲明中靜態成員的是不是一個成員實例內分配的(這就是這款採用靜態手段),所以它的大小隻有需要時,它的定義是已知的。