Kagamine Len
文章20
标签10
分类2
父类与子类的各种构造函数的调用关系

父类与子类的各种构造函数的调用关系

Attention:

C++的初始化 base b=b(); or base b;调用的是构造函数 base d=b;仍然是一个对d的构造 因此应该调用拷贝构造函数而非拷贝赋值运算符

对于移动构造函数的情况间下列代码:

#include <cstdio>
#include <iostream>
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

×