
不要重载 ||对于原生的 ||有一个非常重要的特点就是判断短路。a b 若a为 false 则不运行 ba || 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) {