为什么要加引用?
Test(Test s)为什么不行?
因为我们拷贝构造函数的参数Test s调用的也是拷贝构造函数,所以这样调用必然造成无穷无尽的递归调用,所以我们必须加引用&
为什么要加const?
很明显是不允许改变参数的值。但是这个是最片面的说法
这个问题其实一直困惑了我很久,直到我阅读STL源码之后,在自己实现的时候发现了一点
我们都知道调用拷贝构造函数有三种:
1、拿对象初始化对象,形如:
Test t1(20);
Test t2(t1); //调用拷贝构造函数
Test t3 = t2; //调用拷贝构造函数
2、拿对象作为函数的参数
void show(Test t);
Test t1(10);
show(t1); //调用拷贝构造函数
3、拿对象作为返回值
Test show(void)
{ return Test(20); }
Test t = show(); //调用拷贝构造函数
而const这个问题恰恰就出现在第三项,拿对象作为返回值
首先我们得知道,返回一个局部变量是通过一个临时的变量返回,对象也不例外,这里也会产生一个临时的对象,而这个临时对象,具有常性,也就是const,不可被修改,赋值之后临时对象也就消亡了
当我们编写拷贝构造函数时,并不加上const,会出现以下错误:
当我们把const加上,编译通过,没有警告,没有错误。
而这一切一切的原因,归咎于那该死的临时对象,具有const常性
所以当我们把const加上,通过严格的参数匹配,编译器才能找到我们的const Test& s版本的拷贝构造函数
#include <iostream>
using namespace std;
class Test
{
public:
Test(int d=0){}
// Test(Test& d) {} //编译出错,原因是临时变量具有常性,拷贝构造时并不匹配
Test(const Test& d) {} //编译通过
};
Test reTmp()
{
return Test(10);
}
int main(void)
{
Test t2 = reTmp();
return 0;
}