1.概念
1)如果构造函数的第一个参数是自身类型的引用(几乎总是const,也可以接受非const,但是无论如何都必须是引用),且任何额外参数都有默认值,则它是拷贝构造函数
2)第一个参数必须是自身类型的引用:如果某个函数具有这个类的非引用参数,调用过程中要进行拷贝初始化,此时要调用拷贝构造函数来拷贝实参,如果拷贝构造函数的第一个参数不是引用,我们又需要拷贝实参,这样将无限循环下去
3)拷贝构造函数只有一个形参时,也可以被explicit修饰,当被explicit修饰时,不能使用“=”来调用拷贝构造函数
class A { public: A(){} A(const A&) { cout << "我是A的拷贝构造函数" << endl; } }; class B { public: B() {} explicit B(const B&) { cout << "我是B的拷贝构造函数" << endl; } }; int main() { A a; A aa1(a); A aa2=a; B b; B bb1(b); //B bb2 = b; //如果有此句,则发生编译错误,因为B的拷贝构造函数是explicit的 return 0; }
运行结果:
2.合成拷贝构造函数
如果我们没有为一个类定义拷贝构造函数,编译器将会为我们定义一个,这个就叫合成拷贝构造函数