Присвоение в описании класса

178
02 февраля 2018, 22:18

В какой момент времени во время исполнения произойдет присвоение int a = 5?

class B {
private:
   int a = 5;
public:
   B();
   ~B();
}
Answer 1

Это никакое не "присвоение". Это инициализатор и использоваться он будет для инициализации B::a, а не для присваивания. Альтернативной (и эквивалентной) формой записи будет

class B {
  ...
  int a{ 5 };
  ...
};

Этот инициализатор будет использован для инициализации по умолчанию этого члена класса в конструкторах этого класса. Если вы "забудете" явно проинициализировать B::a в списке инициализации конструктора класса B

B::B() // Инициализация для `a` отсутствует
  {}

то B::a будет неявно проинициализировано значением 5. Как будто кто-то за вас тихонько написал

B::B() : a(5) 
  {}

Если же вы сами явно проинициализируете B::a в конструкторе

B::B() : a(42) 
  {}

то указанный вами выше инициализатор 5 будет просто проигнорирован.

У вас в классе B может быть много разных конструкторов. Какие-то из них могут явно инициализировать B::a, а какие-то - не делать явной инициализации для B::a. В последнем случае в дело будет вступать ваше 5

class B 
{
private:
   int a = 5;
public:
   B(int) : a(42) // Здесь есть явная инициализация `a`
   {
     // Здесь `a` равно 42
   }
   B(double)      // Здесь нет явной инициализации `a`
   {
     // Здесь `a` равно 5
   }
};

Функциональность таких инициализаторов не сводится только к конструкторам. Они учитываются и в "бесконструкторных" формах инициализации. Например, если класс является агрегатом и инициализируется при помощи агрегатной инициализации, то такие инициализаторы тоже принимаются во внимание компилятором

struct S
{
  int x;
  int y = 42;
  int z;
};
...
S s = { 5 }; // Агрегатная инициализация 
// Здесь `s.x` равно 5, `s.y` равно 42, `s.z` равно 0
READ ALSO
Ошибка в работе со стеком LUA из C++

Ошибка в работе со стеком LUA из C++

ПриветствуюРаботаю со скриптом LUA и C++

178
Периодически вызываемый GetProcessTime выдаёт одно и то же значение

Периодически вызываемый GetProcessTime выдаёт одно и то же значение

Добрый деньПоставил перед собой задачу написать маленький органайзер, отслеживающий как долго работают те или иные окна, сделал через отслеживание...

178
QPushButton - подсветка при наведении - не работает в винде

QPushButton - подсветка при наведении - не работает в винде

Для QPushButton задаю иконку с 3мя установленными картинками: Normal, Disabled, ActiveПосле сборки и запуска на linux, всё отрабатывает как ожидается - при наведении...

173