拷贝构造函数的形参必须是引用,这是编译器强制规定的,否则不能编译通过。
为什么?
调用拷贝构造函数的三种情况
- 用已知的对象拷贝生成新对象
- 以值传递的方式传入函数
- 函数的返回值是以值传递的方式
形参为什么一定要传引用
假如我们的拷贝构造函数是这样的A(A a);,这是一个值传递,那我们会调用一个拷贝构造函数,而调用的拷贝构造函数还是值传递,那么我们就需要继续调用拷贝构造函数,这样的的话就是子子孙孙无穷匮也,内存就爆炸啦,因此必须传引用。
形参为什么一定要const引用
其实const不是必须的,但是为了兼容性,就需要加上const
A Function(){
A a;
return a;
}
这是第三种情况,函数的返回形式是值传递。如果这时候的我们的拷贝构造函数是A(A& a);,这就出现了一个问题,我们没有办法对函数里的一个局部对象进行传引用的。这个时候我们就要利用右值引用A(A&& a);
关于右值引用可以参考我的另一篇博客:
但是右值引用只能接受右值,左值引用只能接受左值。为了兼容性就需要我们的常量左值引用出场了,A(const A& a);,它既能接受左值,又能接受右值。
A(const A& a);
这种写法是我们第一次写拷贝构造函数的时候就使用的形式,但是不知道这背后有这么多情况的考量。