Как можно инициализировать поля класса? - PullRequest
7 голосов
/ 16 июля 2010

Немного простой вопрос, но мне трудно отыскать окончательный ответ.

Есть ли в инициализаторе список только способа инициализации полей класса в C ++, кроме присвоения в методах?

В случае, если я использую неправильную терминологию, вот что я имею в виду:

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

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

EDIT : в частности, есть ли хороший способ инициализировать поле структуры с помощью инициализатора структуры? Например:

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

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

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

Ответы [ 4 ]

6 голосов
/ 16 июля 2010

В C ++ x0 должен работать и второй путь.

Являются ли списки инициализаторов единственным способом инициализации полей классов в C ++?

В вашем случае с вашим компилятором: Да.

3 голосов
/ 16 июля 2010

Статические члены могут быть инициализированы по-разному:

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

int Test::x = 5;

Я не знаю, можете ли вы назвать это «хорошим», но вы можете инициализировать элементы структуры довольно чисто, например:

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

stype initialSVal = {
"hi",
7
};

class Test {
public:
    Test(): s(initialSVal) {}
    stype s;
};
1 голос
/ 16 июля 2010

Просто отметим, что в некоторых случаях у вас нет другого выбора, кроме как использовать списки инициализаторов для установки значения элемента в конструкции:

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.
 }
};
0 голосов
/ 16 июля 2010

Рекомендуемый и предпочтительный способ - инициализировать все поля в конструкторе, как в первом примере. Это справедливо и для структур. Смотрите здесь: Инициализация статической структуры tm в классе

...