成员函数 vs 运算符重载

Member function vs Operator overloading

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

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

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

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

只有在完全清楚它的作用时我才会这样做。阅读代码最好避免重载。因为你的大脑是用来读单词的,而不是一些运算符。有时操作员可能会做一些与您想象的不同的事情。但我觉得 == 已经足够清楚了。

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

作为对其他答案的补充:

非成员运算符==成员运算符==或某种等于[我想到的 =29=] 方法是在比较 class/structure.

对象时使用隐式转换的机会

所以,如果你有一些结构 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;