父类与子类的各种构造函数的调用关系
Attention:
C++的初始化 base b=b(); or base b;调用的是构造函数 base d=b;仍然是一个对d的构造 因此应该调用拷贝构造函数而非拷贝赋值运算符
对于移动构造函数的情况间下列代码:
class A
{
public:
A(){ printf("a"); }
A(const A&){ printf("b"); }
A(A&& a) { printf("c"); }
A operator = (const A&){ printf("d"); }
};
class B:public A
{
public:
B():A(){ printf("1"); }
B(const B& b):A(b) { printf("2"); }
B(B&& b):A(b) { printf("3"); }
B operator = (const B&){ printf("4"); }
};
int main()
{
B b=B();
B m(b);
B n = b; //此处是初始化 应该采用拷贝构造的方式初始化
n=b;
B q(std::move(b)); //进入移动构造函数后 b被拷贝为一个左值,然后会调用A的拷贝构造函数
return 0;
}
最后的输出结果:a1b2b24b3
