不要重载 && ||

对于原生的&& ||有一个非常重要的特点就是判断短路。

  • 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) {

更多推荐