2

次のC++コードでは:

struct Features {
  int F1;
  int F2;
  int F3;
  int F4;
  Features(int F1,int F2,int F3,int F4)
  : F1(F1), F2(F2), F3(F3), F4(F4) { }
};

この部分はどういう意味ですか?

Features(int F1,int F2,int F3,int F4)
      : F1(F1), F2(F2), F3(F3), F4(F4) { }

ありがとう。

4

3 に答える 3

8

コンストラクターの初期化子リストを使用してメンバー変数を初期化しています。コンストラクターのパラメーターの名前がデータ メンバーと同じでない場合は、より明確になります。

Features(int a,int b,int c,int d)
      : F1(a), F2(b), F3(c), F4(d) { }

コード内のローカル変数と簡単に識別および区別できるように、データ メンバーに何らかの命名規則を設定すると便利です。例は、接頭辞m_または末尾の使用_です。

struct Features {
  int m_f1;
  int m_f2;
  int m_3f;
  int m_f4;
  Features(int f1,int f2,int f3,int f4)
  : m_f1(f1), m_f2(f2), m_f3(f3), m_f4(f4) { }
};

これらのコンストラクタは両方とも、次のように使用できます。

Features f(11,22,33,44);
std::cout << f.m_f1 << "\n"; // prints 11
std::cout << f.m_f2 << "\n"; // prints 22
std::cout << f.m_f3 << "\n"; // prints 33
std::cout << f.m_f4 << "\n"; // prints 44

このコンストラクターが定義されているという事実は、コンパイラーがデフォルトのコンストラクターを提供しなくなることを意味することに注意してください。したがって、これを実行できるようにしたい場合:

Features f;

次に、独自のデフォルト コンストラクターを提供する必要があります。

Features() : m_f1(), m_f2(), m_f3(), m_f4() {} // initializes data members to 0
于 2012-07-30T13:09:51.880 に答える
2

メンバー変数の初期化です

あなたはこのようにすることができます:

Features(int F1,int F2,int F3,int F4)
{
    this->F1 = F1;
    this->F2 = F2;
    this->F3 = F3;
    this->F4 = F4;
}

しかし

Features(int F1,int F2,int F3,int F4)
      : F1(F1), F2(F2), F3(F3), F4(F4) { }

ユーザー定義型の場合、デフォルトのコンストラクターが自動的に呼び出され、オーバーヘッドが発生する可能性があるため、推奨されます。メンバー変数にデフォルトのコンストラクターがない場合は、初期化リストで初期化する必要があります。定数フィールドも初期化リストで初期化する必要があります

また、初期化リストを使用する方がより明確だと思います

于 2012-07-30T13:09:12.957 に答える
1

このチュートリアルを読んでください。それはあなたの質問に答えるはずです。

于 2012-07-30T13:10:14.023 に答える