Читал статью на MSDN и там был такой код:
#include <iostream>
using namespace std;
class Contained1 {
public:
Contained1() {
cout << "Contained1 constructor." << endl;
}
};
class Contained2 {
public:
Contained2() {
cout << "Contained2 constructor." << endl;
}
};
class Contained3 {
public:
Contained3() {
cout << "Contained3 constructor." << endl;
}
};
class BaseContainer {
public:
BaseContainer() {
cout << "BaseContainer constructor." << endl;
}
private:
Contained1 c1;
Contained2 c2;
};
class DerivedContainer : public BaseContainer {
public:
DerivedContainer() : BaseContainer() {
cout << "DerivedContainer constructor." << endl;
}
private:
Contained3 c3;
};
int main(void)
{
DerivedContainer dc;
}
Там было написано: Сначала вызывается конструктор базового класса, затем инициализируются члены базового класса...
, но у меня выводит:
Contained1 constructor.
Contained2 constructor.
BaseContainer constructor.
Contained3 constructor.
DerivedContainer constructor.
Я не понимаю почему он сначала инициализирует члены базового класса, а потом выполняет конструктор
При вызове конструктора сначала произойдет инициализация его членов (либо значениями, которые вы указали явно, либо значениями по умалчанию, ну или мусором), а уже потом произойдет то, что вы прописали внутри фигурных скобок в конструкторе. Тобишь:
class BaseContainer {
public:
BaseContainer() /*вот сдесь произойдет инициализация членов*/ {
/*а вот сдесь уже все что вы описали в конструкторе*/
cout << "BaseContainer constructor." << endl;
}
private:
Contained1 c1;
Contained2 c2;
};
Когда вы делаете так:
BaseContainer alfa;
Вызывется конструктор BaseContainer
по умолчанию, который сначала инициализирует члены класса, а потом уже выполнит все, что вы указали в фигурных скобках.
PS важно понимать, что ИНИЦИАЛИЗАЦИЯ это не присваивание, и происходит оно прежде, чем будет выполнена какая-либо инструкция в фигурных скобках. Тобишь, если совсем по простому, между вызовом конструктора и открытием фигурной скобки.
Давайте разбираться. Итак, написано -
Вызывает конструкторы базовых классов и членов в порядке объявления.
Т.е. у вас сначала конструируется базовый класс - BaseContainer
, потом конструктор члена Contained3
(к счастью, члены у вас не являются производными, так что глубже копать не нужно). И только потом вызывается сам конструктор DerivedContainer()
. И так для каждого класса.
BaseContainer
своего базового класса не имеет, так что в порядке объявления вызываются только конструкторы членов -
Contained1
Contained2
а затем сам конструктор базового класса
BaseContainer
Затем, как уже мы говорили, вызовется конструктор
Contained3
и последним - самый "внешний" конструктор DerivedContainer()
.
Итак,
Contained1
Contained2
BaseContainer
Contained3
DerivedContainer
Все, как написано в MSDN...
Мне кажется, вы неверно прочли
Вызывает конструкторы базовых классов и членов в порядке объявления.
как
Вызывает конструкторы базовых классов и членов базового класса в порядке объявления. - т.е. что вызывается конструктор базового класса, а потом конструкторы членов базового же класса...
Для любого класса порядок конструирования таков:
Этот порядок действует и для вашего базового класса, поэтому сначала конструируются его члены, потом вызывается конструктор базового, после конструктор члена этого класса, а потом конструктор данного класса, что вы и видите в результате...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В Gson имеется такая возможность как полный контроль над этапом Serializer и Deserializer объекта
На сервере лежат довольно большие файлы в формате mp3, есть необходимость прослушать их не с начала, а с определенного местаПри вызове seekTo()...
В домашнем задании нужно создать новый конструкторВ проекте уже существует один, который генерирует кошек
По ходу создания программы в JavaFX для красоты решил запретить изменять расположение разделителя (Divider)Вот моя попытка: