Учитывая эту программу:
#include <iostream>
class C
{
public:
C(void): a(1)
{ a=2; }
int a{3};
};
int main(void)
{
C c{};
std::cout << c.a; // 2
}
Я вижу три формы инициализации членов данных:
Когда использовать что?
1: Использование объявления в теле класса
Вы должны использовать это, когда член всегда будет инициализирован с одним и тем же значением, и не имеет смысла явно указывать это для каждого конструктора.
2: Использование списка инициализаторов членов
Список инициализатора элемента, очевидно, необходим для элемента, в котором отсутствует конструктор по умолчанию, но, кроме этого, если вы инициализируете элемент на основе конструктора, имеет смысл сделать это здесь.
3: Использование тела конструктора
Тело конструктора более полезно для логики, которая не может быть выполнена одним оператором (в списке инициализации). Однако я не думаю, что есть большая разница между инициализацией POD в списке инициализатора члена или в теле конструктора.
Мое предложение заключается в использовании:
int a{3};
Это гарантирует, что a
инициализируется в 3
независимо от того, сколько у вас конструкторов в классе.
Мой второй выбор будет использовать список инициализации члена.
c(void) : a(1) {}
Третий вариант, использующий код для установки значения переменной-члена, следует избегать.