初识c++(29)之拷贝构造函数的形参为什么必须是const引用

拷贝构造函数的形参必须是引用,这是编译器强制规定的,否则不能编译通过。

为什么?

调用拷贝构造函数的三种情况

  1. 用已知的对象拷贝生成新对象
  2. 以值传递的方式传入函数
  3. 函数的返回值是以值传递的方式

形参为什么一定要传引用

假如我们的拷贝构造函数是这样的A(A a);,这是一个值传递,那我们会调用一个拷贝构造函数,而调用的拷贝构造函数还是值传递,那么我们就需要继续调用拷贝构造函数,这样的的话就是子子孙孙无穷匮也,内存就爆炸啦,因此必须传引用。

形参为什么一定要const引用

其实const不是必须的,但是为了兼容性,就需要加上const

A Function(){
    A a;
    return a;
}

这是第三种情况,函数的返回形式是值传递。如果这时候的我们的拷贝构造函数是A(A& a);,这就出现了一个问题,我们没有办法对函数里的一个局部对象进行传引用的。这个时候我们就要利用右值引用A(A&& a);

关于右值引用可以参考我的另一篇博客:

但是右值引用只能接受右值,左值引用只能接受左值。为了兼容性就需要我们的常量左值引用出场了,A(const A& a);,它既能接受左值,又能接受右值。

A(const A& a);

这种写法是我们第一次写拷贝构造函数的时候就使用的形式,但是不知道这背后有这么多情况的考量。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值