C++的拷贝构造函数为什么参数是const Test& s?

为什么要加引用?

Test(Test s)为什么不行?

因为我们拷贝构造函数的参数Test s调用的也是拷贝构造函数,所以这样调用必然造成无穷无尽的递归调用,所以我们必须加引用&

为什么要加const?

很明显是不允许改变参数的值。但是这个是最片面的说法

这个问题其实一直困惑了我很久,直到我阅读STL源码之后,在自己实现的时候发现了一点

我们都知道调用拷贝构造函数有三种:

1、拿对象初始化对象,形如:

Test t1(20);

Test t2(t1);        //调用拷贝构造函数

扫描二维码关注公众号,回复: 9155248 查看本文章

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;

}
发布了23 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/TanJiaLiang_/article/details/86691437