C++ 运算符重载 : implementing + with +=

标签 c++ operator-overloading

Operator overloading

显示这是通过以下方式完成的

class X {
  X& operator+=(const X& rhs)
  {
    // actual addition of rhs to *this
    return *this;
  }
};
inline X operator+(X lhs, const X& rhs)
{
  lhs += rhs;
  return lhs;
}

我理解为什么参数lhs需要按值取值,但是为什么我们需要按值返回呢?我的意思是,以下内容有什么问题:

inline X& operator+(X lhs, const X& rhs)
{
  lhs += rhs;
  return lhs;
}

在函数内部,lhs 是一个新的X,修改它不会影响两个操作数中的任何一个。由于这是新的,我们可以通过引用返回它,对吧?

最佳答案

返回对本地对象的引用的问题是调用者将收到到达时已经死亡的东西。

当你退出一个函数时,所有局部变量都会被销毁,所以你不能继续使用对它们的引用。

代码如下

const X& res = a+b;

如果运算符按值返回会起作用,因为语言中有一条特定规则规定绑定(bind)到引用的临时对象将保持事件状态,直到引用本身被销毁。

相反,返回引用是不同的,因为对象的生命周期是被调用操作符的责任,而不是调用者的责任。因此最终结果将是绑定(bind)到已销毁对象的引用。

即使只是

X res;
res = a+b;

不会工作,因为当运算符调用返回时,对象在分配给 res 之前被销毁。对于复制构造函数 X res = a+b; 也是如此。

关于C++ 运算符重载 : implementing + with +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16785307/

相关文章:

c++ - 错误 C2804 : binary 'operator +' has too many parameters (compiling with VC 120)

c++ - 使用 unique_ptr 数据成员重载用户定义类型的 operator=

c++ - 为什么不能重载三元运算符?

c++ - AVL Tree - 无法将根传递给插入方法

c++ - 从vector中删除元素,vector被struct填充

c++ - 如何检查 C++ 代码中的内存泄漏。有没有免费的内存泄漏检测工具

myClass(x,y,z) = value 的 C++ 运算符重载

c++ - 让 C++ 在 Eclipse 中编译

c++ - RapidXML - 如何处理丢失的节点/值

r - 在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?