17

クラスメンバー変数の初期化について混乱があります。

私の.hファイルに次のようなものがあるとします。

class Test {

int int_var_1;
float float_var_2;

public:
       Test();
}

私の.cppは次のようになります:

Test::Test() : int_var_1(100), float_var_2(1.5f) {}

クラスをインスタンス化すると、変数は100と1.5に初期化されます。

しかし、コンストラクターで実行しているのがそれだけの場合は、.cppで次のことを実行できます。

int Test::int_var_1 = 100;
float Test::float_var_2 = 1.5f;

コンストラクターで変数を初期化することと、解決演算子を使用することの違いについて混乱しています。

スコープ解決を使用してコンストラクターの外部で変数を初期化するこの方法は、静的変数にのみ適用されますか、それとも通常の変数に対しても実行できる方法がありますか?

4

2 に答える 2

21

一方を他方に置き換えることはできません。メンバー変数が静的でない場合は、初期化リスト(またはコンストラクター本体ですが、初期化リストの方が適しています)*を使用する必要があります。メンバー変数が静的である場合は、2番目のブロックの構文を使用して定義でそれらを初期化する必要があります。

* Alsは、C ++ 11では、非静的メンバー変数の宣言に初期化子を指定することもできることを正しく指摘しています。

class test {
   int data = 5;
};

data(5)明示的に言及されていない初期化リストに暗黙的に追加されますdata(暗黙的に定義されたデフォルトコンストラクターを含む)

于 2012-08-29T02:45:31.367 に答える
2

const非静的変数を(コンストラクターで)初期化するときは、最初の方法を使用する必要があります。これが、これらの種類のメンバー変数を変更できる唯一の方法です(C ++ 11を使用している場合を除く)。

静的メンバー変数は、適切なスコープ解決演算子(クラス外)を使用して初期化できます。

于 2012-08-29T02:43:53.607 に答える