2011-11-25 10 views
12

CおよびC++では、すべての静的変数はデフォルトでZEROに初期化されます。なぜC++で静的クラス変数を初期化する必要がありますか?

これは静的クラスのデータメンバーのケースではありません。何故ですか?

クラススコープで
#include <iostream> 
using namespace std; 

int var; 

class MyClass 
{ 
public: 
    static int classVar; 
}; 
int MyClass::classVar = 0; // Why I have to init it here? 

int main(void) 
{ 
    cout << ::var << endl;   // this is initalized to ZERO by default 
    static int var; 
    cout << var << endl;   // and this also is initalized to Zero 
    cout << MyClass::classVar << endl; 

    return 0; 
} 
+0

は、あなたはそれが時々可能性、可能です** VAR ** 0に初期化されていることを確認、しかし、わからないではありません。 –

+3

@AlessandroPezzato:実際には、標準の下で(リテラル値が、私が思うものは直接影響を受ける可能性が影響されたそれらの組み込み関数から離れて...動的初期化を実行する前に、すべてのグローバル変数のためのメモリをゼロについて明示的ですそれは観察できないからです)。 –

答えて

21

int MyClass::classVar = 0; // Why I have to init it here? 

定義

static int classVar; 

宣言、すなわちです。変数はと定義されており、と定義されています。を一度だけ定義する必要があります。宣言した変数。

これは、クラス宣言が複数のソースファイルに含まれる可能性が高いということです。その一部が定義であるかどうかは、何度も繰り返されます:これは誤りです(例外はインライン[メンバ]関数です)。値の初期化ルールに従って、あなたは定義として

int MyClass::classVar; // Zero-initialized ! 

一緒に得ることができます

注意。

int var; 

は宣言、及び定義は次のとおりです:名前空間スコープで宣言

変数は、(彼らは資格externない限り)あまりにも定義されているあなたは、ヘッダーにこれを入れて、複数の翻訳単位に含める場合は、あなたはエラー( "多重定義されたシンボル"、またはそれらの行に沿ったもの)を持っています。

【上記varconstある場合、それは乗算含まれるヘッダに入れなければならないC++(はなく、Cで)で、それは自動的にstaticとなり、一つの定義ルールの違反がないことに留意されたいです。これは少しオフトピックになりますが、]

+2

私はそれが尋ねられていることはわかりません。私はそれを "なぜ= 0;を入れなければならないのか?" – Mat

+0

@Alexandre C .:それがなぜ必要なのか説明してもよかったです。 – Nawaz

+3

ゼロ初期化だけが必要な場合は、 'int MyClass :: classVar;'ですでに十分でしょうか?それを試みたことはありませんが、Stdと削除された回答によれば、実際にはそれがあります。 – zerm

2

静的クラスのデータ変数は、コンパイラにその値が何であるかを伝える必要があるため、初期化する必要があります。クラスはデフォルト値の概念を持つ必要はありません。

変数タイプは、intの場合は論理値が0、doubleの場合はstring "の場合などです。対照的に、クラスは必ずしもデフォルト値を持つ必要はありません。たとえば、class Rectangleと考えてください。ゼロ値とは何か - 正方形のゼロの長方形または単位の長さの長方形ですか?静的変数の場合、すべてのデータ型をデフォルト値で初期化できるわけではないので、コンパイラは自分自身を定義するように要求します。

+1

私は思いますあなたはここに間違っている:何も静的変数を定義し、それを初期化しないからあなたを妨げていない変数は、クラスのインスタンスである場合には、そのコンストラクタが呼び出されます – qdii

+0

静的変数定義されているコンストラクタは、それを初期化しません。。。。以下の例を考えてみてください...もし "int test :: k;"がコメントされるとコンパイルされません。 クラステスト { public: static int k; }; int test :: k; メインINT(){ 試験T。 cout << t.k; return 0; } – rakesh

+0

@victorはい、そうです、それを私に気付いてくれてありがとう。問題は、初期化ではなく静的変数の定義についてでした。 –

関連する問題