【问题标题】:Overloading Arithmetic Operators重载算术运算符
【发布时间】:2009-03-13 11:12:35
【问题描述】:

赋值运算符可以声明为

T& 运算符= (const t&);

在一个类中,但算术运算符不能这样定义。它必须是朋友功能。我不明白为什么?能解释一下吗?

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    算术运算符不应该是友元

    你可以这样定义:

    MyClass MyClass::operator + (const MyClass& t) const
    {
      MyClass ret(*this);
      ret += t;
      return ret;
    }
    

    a + b 确实是语法糖,编译器会将其扩展为a.operator+(b)。前面的例子如果你所有的对象都是MyClass实例就可以了,但是如果你要操作其他类型就不行了,即1 + a,就不行了,这个可以通过朋友来解决。

    MyClass operator + (int i, const MyClass& t)
    {
      MyClass ret(i);
      ret += t;
      return ret;
    }
    

    当 + 运算符的左侧不是一个类,或者它是一个类但你不能将运算符 + 添加到它的定义时,必须这样做。

    【讨论】:

      【解决方案2】:

      我认为C++ FAQ Lite会给你一个明确的答案。

      【讨论】:

        【解决方案3】:

        理想情况下,它们应该是全局变量,不一定是朋友,这样您就可以编写:

        yourtype v = 1;
        yourtype w = 1 + v;
        

        因为 1 不是 yourtype 的对象,所以如果 operator+ 是成员,它将抛出一个合适的结果。但是,将其设为全局会使其将 1 转换为 yourtype,然后执行操作。使其成为朋友有助于根据需要提取和操纵yourtype 的成员——尽管不是必需的。例如:你可以实现成员函数operator+=,并在operator+的实现中使用它。

        【讨论】:

          【解决方案4】:

          问题是,如果你这样做:

          class A
          {
              A& operator+(int n);
              // ...
          }
          
          int main()
          {
              A my_var;
              int integer = 1;
              A + integer; // compiles
              integer + A // error: no function operator+(int, A) defined
          }
          

          它不会编译。 一种解决方案是将 operator+(int, A) 和 operator+(A, int) 定义为 A 的朋友。 附带说明一下,Boost Operators 库使这个过程变得非常简单。

          【讨论】:

            猜你喜欢
            • 2020-03-10
            • 2010-12-10
            • 2016-07-15
            • 1970-01-01
            • 2012-03-11
            相关资源
            最近更新 更多