【发布时间】:2017-08-07 11:41:13
【问题描述】:
如果编程语言允许,我应该总是重载运算符,还是创建一个成员函数更好?
例如:
bool operator ==(...) {...}
要么
bool equals(...){...}
【问题讨论】:
-
这里没有“总是”的答案,但是如果重载运算符足够直观,它通常被认为是一个很好的重载
标签: c++ operator-overloading member-functions
如果编程语言允许,我应该总是重载运算符,还是创建一个成员函数更好?
例如:
bool operator ==(...) {...}
要么
bool equals(...){...}
【问题讨论】:
标签: c++ operator-overloading member-functions
如果运算符直接映射到函数的含义,那么建议使用运算符,例如
== 而不是 equals 因为它比较相等,+ 而不是 add 如果它正在添加例如数学向量,+ 而不是add,如果它是例如附加到列表中。【讨论】:
就像对其他答案的补充:
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;
【讨论】:
只有在绝对清楚它的作用时,我才会这样做。对于阅读代码最好避免重载。因为你的大脑是用来阅读文字的,而不是一些运算符。有时操作员可以做一些你猜想的不同的事情。但我觉得== 已经够清楚了。
如果在某些库中用作回调,则操作符很好用。例如std::sort。您可以定义要使用的operator <,它将定义如何对您的对象进行排序。
【讨论】: