web-dev-qa-db-ja.com

C ++:メンバー変数の初期化

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

私の.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;

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

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

16
madu

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

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

_class test {
   int data = 5;
};
_

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

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

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

2
Mark Garcia