C++——复制构造函数的形参为什么要是const引用

1.首先来说重要的一点, 为什么要是引用
如对于

CBox(CBox initB);//复制构造函数一开始想到的原型
CBox cigar;
CBox myBox(cigar); //如果编写这样一条语句
//那么将生成这样一条对复制构造函数的调用CBox::CBox(cigar);

因为实参是通过按值传递机制传递的。在可以传递对象cigar之前,编译器需要安排创建该对象的副本。因此,编译器为了处理复制构造函数的这条调用语句,需要调用复制构造函数来创建实参的副本。但是,由于是按值传递,第二次调用同样需要创建实参的副本,因此还得调用复制构造函数,就这样持续不休。最终得到的是对复制构造函数的无穷调用。(其实就是创建副本也是需要调用复制构造函数的
所以解决办法先是要将形参改为引用形参:

CBox (CBox &initB);

2.再来说为什么要用const
其实,这里,如果不去改变实参的值的话,不加const的效果和加const的效果是一样的,而且不加const编译器也不会报错,因为函数的形参是引用,则调用函数时不需要复制实参,函数是直接访问调用函数中的实参变量的。但是为了整个程序的安全,还是加上const,防止对实参的意外修改~所以这里再将复制构造函数原型改为以下这种形式:

CBox (const CBox &initB);

测试程序:

#include<iostream>  
using namespace std;  

class Test  
{  
public:  
   Test(const Test &t) { //如果这里为Test(t);则会报错
   /*使用t来拷贝数据成员*/ 
   }  
   Test() {
    /*初始化数据成员*/ 
   }  
};  

Test fun()  
{  
    cout << "fun() Called\n";  
    Test t;  
    return t;  
}  

int main()  
{  
    Test t1;  
    Test t2 = fun();  
    return 0;  
}  
  • 18
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值