为什么类的拷贝构造函数的参数必须是引用

本文详细解释了在C++中拷贝构造函数为何必须使用引用而非直接传值的原因,并通过实例说明了引用的使用优势,解决了两个关键问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  为什么类的拷贝构造函数的参数必须是引用(解决方法来源与优快云
(1)      我首先想如果传值为什么不可以呢,传值可以完成所有的数据成员的复制工作啊。原因在与这个函数本身是个拷贝构造函数,是用来初始化别的新的对象的。
例如:
T&   operator=(T   t); 
 那么我们调用 
 T   t1; 
 T   t t1;时,拷贝构造函数被调用, 
当我们传值t1的时候,我们在函数里面操作的都是一个临时的对象,要在运行栈里面复制一个副本t2,但是这个临时对象的创建也要调用自身这个拷贝构造函数,因此在上面的那个拷贝构造函数的第一次调用内部又再一次调用自身:
 T t(t1)
{ //伪代码
 T t2(t1);
//从这里才是开始用户定义的其他的复制工作
}
T t2=t(t1).来产生函数里面的对象副本t2,这就导致了一个死循环,t2的构造过程中又要调用自身这个拷贝构造函数:
就像下面的情况:
 
T t(t1)
{ //伪代码
 T t2(t1)
{//这里也是先调用本身拷贝一个副本t3
 T t3(t1)
    {//再调用本身拷贝一个副本t4;
     ……………………
//从这里才是开始用户定义的其他的复制工作
}
这样看来,调用要无止境了,所以是不能传值的
第一个问题解决;
 
(2)我又想可以传指针啊,但是传指针是没有传引用方便和直观的
   但是这样用就麻烦了
例如:class T;
T t1;
      如果拷贝构造函数传指针那就要这样调用:
      T t2(&t1);
      现在只要这样就可以:
      T t2(t1);
由于赋值符的重载的实际上跟拷贝构造函数是一样的,此时更明显了//以下描述是错误的,赋值符的重载和拷贝构造函数是不一样的
    T t2=&t1;
    T t2=t1;哪个方便,当然是第二种。
   至此,第二个问题解决;



本文转自:http://blog.youkuaiyun.com/tangaowen/article/details/1701703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值