8

少し基本的な質問ですが、決定的な答えを見つけるのに苦労しています。

初期化子リストは、メソッドでの代入を除いて、C ++でクラスフィールドを初期化する唯一の方法ですか?

間違った用語を使用している場合は、次のように言います。

class Test
{
public:
    Test(): MyField(47) { }  // acceptable
    int MyField;
};

class Test
{
public:
    int MyField = 47; // invalid: only static const integral data members allowed
};

編集:特に、構造体初期化子を使用して構造体フィールドを初期化するための優れた方法はありますか?例えば:

struct MyStruct { int Number, const char* Text };

MyStruct struct1 = {};  // acceptable: zeroed
MyStruct struct2 = { 47, "Blah" } // acceptable

class MyClass
{
    MyStruct struct3 = ???  // not acceptable
};
4

4 に答える 4

6

C ++ x0では、2番目の方法も機能するはずです。

初期化子リストは、C ++でクラスフィールドを初期化する唯一の方法ですか?

コンパイラの場合:はい。

于 2010-07-16T12:05:49.470 に答える
3

静的メンバーは別の方法で初期化できます。

class Test {
    ....
    static int x;
};

int Test::x = 5;

これを「nice」と呼ぶかどうかはわかりませんが、次のように構造体メンバーをかなりきれいに初期化できます。

struct stype {
const char *str;
int val;
};

stype initialSVal = {
"hi",
7
};

class Test {
public:
    Test(): s(initialSVal) {}
    stype s;
};
于 2010-07-16T12:05:16.133 に答える
1

場合によっては、初期化リストを使用して構築時にメンバーの値を設定する以外に選択肢がないことを述べておいてください。

class A
{
 private:

  int b;
  const int c;

 public:

 A() :
  b(1),
  c(1)
 {
  // Here you could also do:
  b = 1; // This would be a reassignation, not an initialization.
        // But not:
  c = 1; // You can't : c is a const member.
 }
};
于 2010-07-16T12:17:03.483 に答える
0

推奨される推奨される方法は、最初の例とまったく同じように、コンストラクターのすべてのフィールドを初期化することです。これは構造体にも有効です。ここを参照してください:クラスでの静的構造体tmの初期化

于 2010-07-16T12:04:38.023 に答える