成员函数 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;
如果编程语言允许,我应该始终重载运算符,还是创建一个成员函数更好?
例如:
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;