zoukankan      html  css  js  c++  java
  • 有关重载运算符的一些思考

    重载“+”运算符后,执行a + b + c报错的原因分析:

     

    1.所谓函数不能返回临时变量的引用,是指局部变量bai在栈空间中分配内存,函数返回du时栈指针回退,当主调函数继续调zhi用其它被调函数时,栈指针上移,上一次函数调用所分配的空间会被本次调用覆盖,如果此时再引用原来的局部变量就会出现不可预见的结果
    https://zhidao.baidu.com/question/154445484.html
    2.不论是成员还是非成员重载运算符,如果返回值类型是对象(不是引用),并且参数列表中的类型是引用,那么可能无法进行连续运算时比如a+b+c,b+c的返回值是个临时对象,不能为其绑定引用。如果返回引用,那么对于+运算会返回一个临时对象的引用,也可能会出问题(根据第一点)
    3.所以如果重载类似+、-这样产生一个新对象的同时不改变原有参数的运算,可能无法进行连续运算比如a+b+c!

    4.一点补充,无论是成员函数重载还是非成员函数重载都可能遇到这个问题,不过顺序不同。成员函数重载“+”返回类型是对象时,可以执行(a+b)+c(因为临时对象作为运算符函数的访问者而不是参数)不能执行a+(b+c)。非成员函数重载“+”返回类型是对象时,两种顺序均无法执行。

    5.重载输出运算符“<<”时,返回类型为ostream的引用,这样可以连续输出(运算),比如cout<<a<<b<<c<<endl;。cout<<a运算后返回cout的引用再进行cout<<b等后续输出。

    6.如果第四点是对的,那么<<运算符的操作顺序就是从左至右了。(好像确实非成员函数重载运算符不保证运算顺序)

  • 相关阅读:
    19年下半年读书清单一览
    2019-2020:时间戳
    全链路压测资料汇总——业内大厂解决方案
    个人公众号开通啦
    windows 10环境下安装Tensorflow-gpu
    如何判断安卓模拟器的型号(品牌)
    socket.io的websocket示例
    Node + Selenium使用小结
    基于SOUI开发一个简单的小工具
    国际化之Android设备支持的语种
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13405399.html
Copyright © 2011-2022 走看看