2012-03-12 12 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 
}; 

方法日付データ型が正しく定義されていないうちに、ここでどのくらいのメモリを割り当てるかをコンパイラが知ることができます!!

これは、ある意味で他の静的な定義とは異なりますか?

+0

コンパイラは、静的メンバーを宣言したときの日付の大きさを知ることができません。しかし、それについて考える - それはこの時点でそれを知る必要はありません。 –

+0

私は推測する** **コンパイラは静的変数のメモリを割り当てていない(クラスの内部に)が、宣言される時はメモリを割り当てません。例えば、フィールドでは宣言時に型自体のサイズを知る必要があります。 私はそれがコンパイラによって行われるかもしれないと思っています。 –

答えて

7

静的メンバーはクラス内に格納されないため、そのサイズはクラスの合計サイズに影響しません。

静的メンバーは、おそらく.cppファイル内に定義する必要があります。その時点でコンパイラにクラスのサイズを知っている必要があります。

5

最初のケースでは、無限のサイズを持つ再帰的な構造体なので、無効です。 2番目のケースでは、実際のメモリ割り当てが宣言の後に行われるため、大丈夫です。

1

あなただけ定義がすでに存在している、すなわち誰のためにそのサイズがその時点で知られているクラス宣言にデータメンバを使用することができます。コンパイラは、と宣言されているときに、クラスインスタンスが必要とするメモリ量を知る必要があります。と宣言している[forward-] 型のポインタと参照を使用することができます(これらはオペレーティングシステムのビット数は多少あります)。

宣言静的部材のは、従って、そのサイズのみが定義だときに知られる必要がある(これは、静的手段のこの使用は何である)部材インスタンス内に割り当てられていません。

関連する問題