class — Когда использовать какую инициализацию элемента данных в переполнении стека

Учитывая эту программу:

#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. используя объявление в теле класса

Когда использовать что?

1

Решение

1: Использование объявления в теле класса

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

2: Использование списка инициализаторов членов

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

3: Использование тела конструктора

Тело конструктора более полезно для логики, которая не может быть выполнена одним оператором (в списке инициализации). Однако я не думаю, что есть большая разница между инициализацией POD в списке инициализатора члена или в теле конструктора.

3

Другие решения

Мое предложение заключается в использовании:

int a{3};

Это гарантирует, что a инициализируется в 3 независимо от того, сколько у вас конструкторов в классе.

Мой второй выбор будет использовать список инициализации члена.

c(void) : a(1) {}

Третий вариант, использующий код для установки значения переменной-члена, следует избегать.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector