即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

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

编程语言 sinat_36053757 18℃ 0评论

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  
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;  
}  

转载请注明:CodingBlog » C++——复制构造函数的形参为什么要是const引用

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情