干货分享|C++运算符——不要重载
·
不要重载 && ||
对于原生的&& ||有一个非常重要的特点就是判断短路。
- a && b 若a为 false 则不运行 b
- a || b 若a为 true 则不运行 b
而能否通过运算符重载实现这样的效果呢?答案是不能,因此运算符重载的本质是函数的调用,函数必须在确认所有参数后才能运行,因此做不到真正的短路。
#include <iostream>
class Node {
public:
int x;
Node(int x) : x(x) {
}
};
Node make_node(const int x) {
static int cnt = 0;
cnt += 1;
std::cout << "make_node used " << cnt << std::endl;
return Node(x);
}
bool operator||(const Node& lhs, const Node& rhs) {
return lhs.x || rhs.x;
}
int main() {
std::cout << std::boolalpha << (make_node(1) || make_node(0)) << std::endl;
}
# 输出
make_node used 1
make_node used 2
true
不要重载原生类型
遵从原生类型的操作,就像遵从自然规律一样。
幸运的是,C++ 在语法层面直接进制了这项操作。
int operator+(int x, int y) {
return x - y;
}
int main() {
1 + 2;
}
error: 'int operator+(int, int)' must have an argument of class or enumerated type
int operator+(int x, int y) {更多推荐



所有评论(0)