У меня есть некоторые сомнения относительно гарантий порядка построения и инициализации в C ++. Например, следующий код имеет четыре класса X
, Y
, Z
и W
. Функция main создает экземпляр объекта class X
, который содержит объект class Y
и является производным от class Z
, поэтому будут вызваны оба конструктора. Кроме того, параметр const char*
, передаваемый конструктору X
, будет неявно преобразован в объект class W
, поэтому также необходимо вызвать конструктор W
.
Какие гарантии дает стандарт C ++ на порядок вызовов конструкторов копирования? Или, что эквивалентно, что эта программа может печатать?
#include <iostream>
class Z {
public:
Z() { std::cout << "Z" << std::endl; }
};
class Y {
public:
Y() { std::cout << "Y" << std::endl; }
};
class W {
public:
W(const char*) { std::cout << "W" << std::endl; }
};
class X : public Z {
public:
X(const W&) { std::cout << "X" << std::endl; }
private:
Y y;
};
int main(int, char*[]) {
X x("x");
return 0;
}
редактировать: это правильно?
W |
/ \ |
Z Y |
\ / |
X V