成员函数与运算符重载

时间:2017-03-16 10:39:59

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

如果编程语言允许,我是否总是重载操作符,或者最好创建成员函数?

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

3 个答案:

答案 0 :(得分:3)

如果操作员直接映射到函数的含义,则建议使用运算符,例如

  • ==代替equals因为它比较了相等,
  • +代替add,如果它正在添加,例如数学向量,
  • 但不是+而不是add,如果它是附在清单上。

答案 1 :(得分:2)

正如其他答案的补充:

非成员运营商== 成员运营商== 或某种等于方法之间的主要区别,我想到了,在比较类/结构的对象时,是一个使用隐式转换的机会。

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

答案 2 :(得分:1)

如果它完全清楚它的作用,我会这样做。对于阅读代码最好避免重载。因为你的大脑习惯于阅读单词而不是某些操作符。有时候运营商可以做一些与你猜测不同的事情。但我认为==足够清楚。

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