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

为什么要加引用?

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;

}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值