C++运算符重载的细节

C++运算符重载的细节

 对象a = 对象b + 对象c

一、值返回还是引用返回
1.值返回:
在重载函数里创建一个局部对象(需要考虑构造新对象过程中对静态数据成员的影响),为这个局部对象进行赋值(b+c的实际意义)然后用于返回,这种方法在返回值后,编译器利用该局部对象(b+c)为对象a进行赋值(这里如果不编写赋值运算符的重载函数,则编译器自动调用默认的赋值运算符的重载函数,为对象a进行赋值,这种情况下的赋值为浅拷贝,对象a与临时对象(b+c)共享系统资源)
对此,简而言之,如果对象中没有独立地占用堆等系统资源,则让编译器调用默认的赋值运算符的重载函数就行了,反之,则需要编写赋值运算符的重载函数进行深拷贝

赋值运算符的编写
1.释放被赋值的对象的原来的系统资源(堆区空间),也就是把对象a原来拥有的堆区资源释放。(类似于析构过程—不可等同,也不可直接调用析构函数,调用析构函数比这多了释放对象的空间等步骤)
2.为被赋值的对象进行重新赋值并重新分配系统资源(堆区空间)(类似于拷贝构造过程)

赋值运算符的重载函数与拷贝构造函数的区别
拷贝构造函数是一种“构造函数”,是在对象进行创建的时利用其他对象为其赋初值的函数
而赋值运算符的重载函数是为一个已经创建过的对象,利用其他对象的值为其赋值

2.引用返回
先向利用堆区空间创建一个对象a,为其赋值并返回其引用

选择引用返回的作用:

  1. 允许进行连续赋值
  2. 防止返回对象(返回对象也可以进行连续赋值(常规的情况,如a = b = c,而不是(a = b) = c))的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符的效率。
    对于第二点原因:如果用”值传递“的方式,虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。

值返回的作用
由上面可知,当重载的运算符只是需要用于产生临时对象来进行赋值等操作,赋值完该临时对象就不需要的时候,就应该采用值返回;
而如果这个时候采用引用返回,则会导致新对象占用的堆区空间难以释放的问题,还需要考虑构造新对象过程中对静态数据成员的影响

引用返回的作用
减少调用拷贝构造函数和析构函数的次数

人话就是:加减乘除用值返回;与赋值相关的用引用返回(= += -= *= <<输出流)

部分参考https://www.cnblogs.com/codingmengmeng/p/5871254.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值