2009-04-06 8 views
15

クラスデータメンバを初期化する正しい場所はどこですか? 私はこのようなヘッダファイル内のクラス宣言がある:クラス変数を初期化する場所を修正しますか?

foo.hという:

class Foo { 
private: 
    int myInt; 
}; 

そしてIは、対応する.cppファイルにミンに値を設定しよう:

フー。 cpp:

int Foo::myInt = 1; 

myIntを再定義するとコンパイルエラーが発生します。私は間違って何をしていますか?

答えて

28

あなたにはインスタンス変数があります。クラスの各インスタンスは、myIntの独自のコピーを取得します。それらを初期化する場所は、コンストラクタである:

class Foo { 
private: 
    int myInt; 
public: 
    Foo() : myInt(1) {} 
}; 

クラス変数クラスのすべてのインスタンスで共有されている唯一のコピーがある場合です。それらはあなたが試みたときに初期化することができます。

class Foo { 
private: 
    static const int myInt = 1; 
}; 

これは、すべてのインスタンスで共有される単一の値は次のとおりです。あなたも右のクラス定義で静的定数を初期化するオプションがあり、整数値については

(構文についてはJaredParの答えを参照してください)クラスは変更できません。

+2

こんにちは、あなたは 'Foo():myInt(1){}'の構文の名前を教えてください。私はそれをGoogleでもっと詳しく読むことができますか?それは と同じですか?public:Foo(){myInt = 1; } '? – SexyBeast

+5

@Cupidvogel:「メンバーイニシャライザリスト」(http://en.cppreference.com/w/cpp/language/initializer_list) – Eclipse

1

クラス変数には「静的」とマークする必要があります。変数がクラス変数ではなくインスタンス変数である場合は、コンストラクタまたは他のメソッドで初期化する必要があります。

4

静的初期化構造を使用してインスタンスメンバーを初期化しようとしています。これをクラスレベルの変数(静的)にしたい場合は、その変数の前にstaticキーワードを付けます。

class Foo { 
private: 
    static int myInt; 
}; 
+0

ありがとうございました!私は、 "クラスレベルの変数"は、クラス内でのみ使用でき、他の場所では使用できないものと仮定していますか? –

+0

@draftomatic、クラスレベルの変数iは、クラスのインスタンスに関連付けられていない変数を意味します。 Foo(そしてその友人)の中だけでFoo :: myIntと言うことができます。 Fooのインスタンスは必要ありません。 – JaredPar

10

Jaredの答えを拡張するには、今のように初期化したい場合は、コンストラクタに配置する必要があります。

+0

+1の方法を説明し、長所と短所を説明し、 "初期化子リスト"(他の言語から来たプログラマーに対して受け入れられた解答の "コンストラクター内の記述"とはまったく異なっています) "コンストラクター内"は、コンストラクターの中括弧の間にあります。そして、この答えはそれを私のためにすべてまとめています。 –

6
class Foo 
{ 
public: 
    Foo(void) : 
    myInt(1) // directly construct myInt with 1. 
    { 
    } 

    // works but not preferred: 
    /* 
    Foo(void) 
    { 
     myInt = 1; // not preferred because myInt is default constructed then assigned 
        // but with POD types this makes little difference. for consistency 
        // however, it's best to put it in the initializer list, as above 
        // Edit, from comment: Also, for const variables and references, 
        // they must be directly constructed with a valid value, so they 
        // must be put in the initializer list. 
    } 
    */ 

private: 
    int myInt; 
}; 

はCで、ヘッダファイルに直接初期化することができる++ 11やGNU ++ 11:

のintミン= 1。

この記事を参照してください。C++11 Tidbits: Non-static Data Member Initializers

+1

リンクを更新できますか? – RJVB

関連する問題