59
// Method One
class ClassName
{
public:
    ClassName() : m_vecInts() {}

private:
    std::vector<int> m_vecInts;
}

// Method Two
class ClassName
{
public:
    ClassName() {} // do nothing

private:
    std::vector<int> m_vecInts;
}

質問> クラスのベクトルメンバー変数を初期化する正しい方法は何ですか? そもそも初期化する必要がありますか?

4

4 に答える 4

39

http://en.cppreference.com/w/cpp/language/default_initializationを参照してください

デフォルトの初期化は、次の3つの状況で実行されます。

  1. 自動保存期間のある変数が初期化子なしで宣言された場合
  2. 動的ストレージ期間のあるオブジェクトが、初期化子なしのnew-expressionによって作成された場合
  3. 基本クラスまたは非静的データメンバーがコンストラクター初期化子リストに記載されておらず、そのコンストラクターが呼び出された場合。

デフォルトの初期化の効果は次のとおりです。

  • Tがクラス型の場合、デフォルトのコンストラクターが呼び出されて、新しいオブジェクトの初期値が提供されます
  • Tが配列型の場合、配列のすべての要素がデフォルトで初期化されます。
  • それ以外の場合は、何も行われません。

std::vectorはクラス型なので、デフォルトのコンストラクターが呼び出されます。したがって、手動で初期化する必要はありません。

于 2012-07-30T16:19:46.747 に答える
26

場合によります。サイズ0のベクトルが必要な場合は、何もする必要はありません。たとえば、42のサイズNのベクトル塗りつぶしが必要な場合は、コンストラクタ初期化子リストを使用します。

ClassName() : m_vecInts(N, 42) {}
于 2012-07-30T16:18:27.190 に答える
4

明示的に初期化する必要はありません。クラスのインスタンスを作成するときに作成されます。

于 2012-07-30T16:18:22.293 に答える