Страницы

Поиск по вопросам

среда, 1 января 2020 г.

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

#cpp #классы


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

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

    


Ответы

Ответ 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

Комментариев нет:

Отправить комментарий