C++运算符重载的细节
对象a = 对象b + 对象c
一、值返回还是引用返回
1.值返回:
在重载函数里创建一个局部对象(需要考虑构造新对象过程中对静态数据成员的影响),为这个局部对象进行赋值(b+c的实际意义)然后用于返回,这种方法在返回值后,编译器利用该局部对象(b+c)为对象a进行赋值(这里如果不编写赋值运算符的重载函数,则编译器自动调用默认的赋值运算符的重载函数,为对象a进行赋值,这种情况下的赋值为浅拷贝,对象a与临时对象(b+c)共享系统资源)
对此,简而言之,如果对象中没有独立地占用堆等系统资源,则让编译器调用默认的赋值运算符的重载函数就行了,反之,则需要编写赋值运算符的重载函数进行深拷贝
赋值运算符的编写
1.释放被赋值的对象的原来的系统资源(堆区空间),也就是把对象a原来拥有的堆区资源释放。(类似于析构过程—不可等同,也不可直接调用析构函数,调用析构函数比这多了释放对象的空间等步骤)
2.为被赋值的对象进行重新赋值并重新分配系统资源(堆区空间)(类似于拷贝构造过程)
赋值运算符的重载函数与拷贝构造函数的区别
拷贝构造函数是一种“构造函数”,是在对象进行创建的时利用其他对象为其赋初值的函数
而赋值运算符的重载函数是为一个已经创建过的对象,利用其他对象的值为其赋值
2.引用返回
先向利用堆区空间创建一个对象a,为其赋值并返回其引用
选择引用返回的作用:
- 允许进行连续赋值
- 防止返回对象(返回对象也可以进行连续赋值(常规的情况,如a = b = c,而不是(a = b) = c))的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符的效率。
对于第二点原因:如果用”值传递“的方式,虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
值返回的作用
由上面可知,当重载的运算符只是需要用于产生临时对象来进行赋值等操作,赋值完该临时对象就不需要的时候,就应该采用值返回;
而如果这个时候采用引用返回,则会导致新对象占用的堆区空间难以释放的问题,还需要考虑构造新对象过程中对静态数据成员的影响
引用返回的作用
减少调用拷贝构造函数和析构函数的次数
人话就是:加减乘除用值返回;与赋值相关的用引用返回(= += -= *= <<输出流)
部分参考https://www.cnblogs.com/codingmengmeng/p/5871254.html