C++ 成员函数与运算符重载
若编程语言允许,我应该总是重载运算符,还是最好创建一个成员函数 例如:C++ 成员函数与运算符重载,c++,operator-overloading,member-functions,C++,Operator Overloading,Member Functions,若编程语言允许,我应该总是重载运算符,还是最好创建一个成员函数 例如: bool运算符==(…){…} 或 bool equals(…){…}如果运算符直接映射到函数的含义,则建议使用该运算符,例如 =而不是等于,因为它比较相等 +而不是添加,如果它正在添加例如数学向量 但如果是添加到列表中,则不要使用+而不是添加 如果运算符直接映射到函数的含义,则建议使用运算符,例如 =而不是等于,因为它比较相等 +而不是添加,如果它正在添加例如数学向量 但如果是添加到列表中,则不要使用+而不是添加 只有
bool运算符==(…){…}
或
bool equals(…){…}
如果运算符直接映射到函数的含义,则建议使用该运算符,例如
而不是=
,因为它比较相等等于
而不是+
,如果它正在添加例如数学向量添加
- 但如果是添加到列表中,则不要使用
而不是+
添加
而不是=
,因为它比较相等等于
而不是+
,如果它正在添加例如数学向量添加
- 但如果是添加到列表中,则不要使用
而不是+
添加
==
已经足够清楚了
如果运算符在某些库中用作回调,则可以很好地使用它们。e、 g.
std::sort
。你可以定义你的操作符我只会在完全清楚它的作用的情况下才这么做。对于读取代码,最好避免重载。因为你的大脑是用来读单词的,而不是一些操作员。有时操作员可以做一些不同于您所猜测的事情。但我觉得==
已经足够清楚了
如果运算符在某些库中用作回调,则可以很好地使用它们。e、 g.std::sort
。您可以定义运算符,作为其他答案的补充:
在我看来,非成员运算符==和成员运算符==或某种equals方法之间的主要区别在于,在比较类/结构的对象时,有机会使用隐式转换
因此,如果您有一些结构X
:
struct X {
X() = default;
X(int) {}
};
bool operator==(const X&, const X&) {
// some logic here
}
您可以为X
定义一个非成员运算符==:
struct X {
X() = default;
X(int) {}
};
bool operator==(const X&, const X&) {
// some logic here
}
然后使用隐式转换:
X x;
std::cout << (42 == x) << " " << (x == 42) << std::endl;
X;
std::cout作为其他答案的补充:
在我看来,非成员运算符==和成员运算符==或某种equals方法之间的主要区别在于,在比较类/结构的对象时,有机会使用隐式转换
因此,如果您有一些结构X
:
struct X {
X() = default;
X(int) {}
};
bool operator==(const X&, const X&) {
// some logic here
}
您可以为X
定义一个非成员运算符==:
struct X {
X() = default;
X(int) {}
};
bool operator==(const X&, const X&) {
// some logic here
}
然后使用隐式转换:
X x;
std::cout << (42 == x) << " " << (x == 42) << std::endl;
X;
std::这里是否没有“始终”答案?但是如果重载运算符足够直观,则通常认为它是一个好的重载。这里是否没有“始终”答案?但是如果重载运算符足够直观,则通常认为它是一个好的重载