【问题标题】:Member function vs Operator overloading [closed]成员函数与运算符重载[关闭]
【发布时间】:2017-08-07 11:41:13
【问题描述】:

如果编程语言允许,我应该总是重载运算符,还是创建一个成员函数更好?

例如: bool operator ==(...) {...} 要么 bool equals(...){...}

【问题讨论】:

  • 这里没有“总是”的答案,但是如果重载运算符足够直观,它通常被认为是一个很好的重载

标签: c++ operator-overloading member-functions


【解决方案1】:

如果运算符直接映射到函数的含义,那么建议使用运算符,例如

  • == 而不是 equals 因为它比较相等,
  • + 而不是 add 如果它正在添加例如数学向量,
  • 但不是+ 而不是add,如果它是例如附加到列表中。

【讨论】:

    【解决方案2】:

    就像对其他答案的补充:

    non member operator==member operator== 或某种 equals 方法之间的主要区别,我想到了, 是在比较类/结构的对象时使用隐式转换的机会。

    所以,如果你有一些结构 X:

    struct X {
        X() = default;
        X(int) {}
    };
    

    您可以为X 定义一个非成员运算符==

    bool operator==(const X&, const X&) {
        // some logic here
    }
    

    然后利用隐式转换:

    X x;
    std::cout << (42 == x) << " " << (x == 42) << std::endl;
    

    【讨论】:

      【解决方案3】:

      只有在绝对清楚它的作用时,我才会这样做。对于阅读代码最好避免重载。因为你的大脑是用来阅读文字的,而不是一些运算符。有时操作员可以做一些你猜想的不同的事情。但我觉得== 已经够清楚了。

      如果在某些库中用作回调,则操作符很好用。例如std::sort。您可以定义要使用的operator &lt;,它将定义如何对您的对象进行排序。

      【讨论】: