Как поля класса могут быть инициализированы?

Определенный основной вопрос, но я испытываю затруднения при разыскивании категорического ответа.

Действительно ли списки инициализатора являются единственным способом инициализировать поля класса в 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
};
7
задан Roman Starkov 30 October 2010 в 09:17
поделиться

4 ответа

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

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

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

6
ответ дан 7 December 2019 в 01:15
поделиться

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

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

int Test::x = 5;

Не знаю, можно ли назвать это "красиво", но вы можете инициализировать члены struct довольно чисто, например, так:

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

stype initialSVal = {
"hi",
7
};

class Test {
public:
    Test(): s(initialSVal) {}
    stype s;
};
3
ответ дан 7 December 2019 в 01:15
поделиться

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

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.
 }
};
1
ответ дан 7 December 2019 в 01:15
поделиться

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

0
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: