Как можно инициализировать поля класса?
Немного простой вопрос, но мне сложно найти окончательный ответ.
Являются ли списки инициализатора единственным способом инициализации полей класса в 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 ответа
В C++x0 должен работать и второй путь.
Являются ли списки инициализатора единственным способом инициализации полей класса в C++?
В вашем случае с вашим компилятором: Да.
Статические члены могут быть инициализированы по-разному:
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;
};
Просто отметим, что в некоторых случаях у вас нет другого выбора, кроме как использовать списки инициализаторов для установки значения элемента в конструкции:
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.
}
};
Рекомендуемый и предпочтительный способ - инициализировать все поля в конструкторе, как в первом примере. Это справедливо и для структур. Смотрите здесь: Инициализация статической структуры TM в классе