【问题标题】:argument type of assignment operator (reference or value?)赋值运算符的参数类型(引用或值?)
【发布时间】:2015-06-23 12:26:28
【问题描述】:

我有一个班级,想为这个班级重载“+”和“=”运算符。所以我将 operator+ 实现为友元函数,将 operator= 实现为成员函数...

如果 operator= 的参数类型定义为引用,则无法运行以下行,因为右侧是一个值并且没有任何地址:

sum = A + B;   // sum, A and B are objects of my class

但我希望能够执行此类分配,并且还希望通过引用将参数传递给 operator=(因为我班级的对象很大)。有可能还是我必须按值将参数传递给 operator=??

【问题讨论】:

  • 你有什么理由选择+的朋友功能和=的会员?

标签: c++ operator-overloading pass-by-reference pass-by-value


【解决方案1】:

你只需要通过reference-to-const来接受参数:

MyClass& operator= (const MyClass&);

const 引用可以绑定到右值,所以sum = A + B 是有效的。

【讨论】:

    【解决方案2】:

    一个类的operator=() 通常接受const 引用。所以X::operator() 将接受const X &。这确实允许链接。非const 引用将不允许传递像A + B 这样的表达式的结果(因为这在逻辑上需要一个临时的)。

    operator=() 用于其他类型的参数(例如 lhs X 和 rhs Y)可以按值传递(如果 Y 具有工作副本构造函数)即 X &X::operator=(Y),但通过 const 引用传递在实践中更常见,仅仅是因为它减少了创建临时对象的机会。

    【讨论】:

      【解决方案3】:

      运算符重载是能够使用引用作为参数的普通函数。请记住通过使用 const 引用而不是干净的引用来处理右值,因为它们会将它们的生命延长到函数的范围内。

      顺便说一句,您不必将 operator+ 声明为友元函数 - 您也可以将其设为类的成员。

      struct A
      {
          int x;
          A(int x): x(x) {}
          A operator+(const A&);
          A& operator=(const A&);
      };
      
      A A::operator+(const A& right_side_of_equation)
      {
          ...
      }
      
      A& A::operator=(const A& object_to_be_assigned)
      {
          ...
      }
      

      【讨论】:

      • 是的,我们可以将 operator+ 声明为成员函数,但在这种情况下,我们不能添加这样的文字(例如字符串类):str1 = "123" + str2;
      • @payman 好点,这也回答了我对 OP 的问题
      猜你喜欢
      • 2011-11-13
      • 2011-02-25
      • 2015-07-16
      • 2011-12-12
      • 2011-05-29
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多