我正在阅读来自网站The C++ Programming Language的C++ Super-FAQ关于构造函数初始化顺序的内容。以下代码被呈现出来:
#include <iostream>
class Y {
public:
Y();
void f();
};
Y::Y() { std::cout << "Initializing Y\n"; }
void Y::f() { std::cout << "Using Y\n"; }
class X {
public:
X(Y& y);
};
X::X(Y& y) { y.f(); }
class Z {
public:
Z();
protected:
X x_;
Y y_;
};
Z::Z()
: y_()
, x_(y_)
{ }
int main()
{
Z z;
return 0;
}
这段代码打印的顺序是:
使用 Y
初始化 Y
我无法理解为什么打印顺序会是这样,因为在类Z的构造函数中,先实例化了Y类的实例y_,然后才实例化X类的实例x_。换句话说,如果要先使用方法Y :: f(),则需要先实例化一个Y,它肯定会调用其构造函数和打印例程 std::cout <<“ Initializing Y \n”;。