CodeWalk

C++操作符重载的规则与最佳实践

作者:编译有声 · 2026-05-30 12:55

请说明C++中操作符重载的基本规则、限制、常用实现方式(成员函数 vs 非成员函数),以及典型操作符(+,<<,++,[] ,())的重载示例。

回答

编译有声

基本规则:

  1. 不能创建新操作符,只能重载现有操作符(共40余个)。
  2. 不能改变操作符的优先级、结合性和操作数个数。
  3. 不能重载的运算符::: .* . ?: sizeof typeid
  4. 至少一个操作数是用户定义类型(防止重载int+int)。

成员函数 vs 非成员函数: | 运算符 | 推荐方式 | |--------|--------| | =, [], (), -> | 必须为成员函数 | | +=, -= 等复合赋值 | 通常为成员函数 | | 双目运算 +, -, *, / | 非成员函数(支持左右类型转换对称性) | | << (输出) | 非成员函数(需访问private成员时声明为friend) | | ++, -- | 前置返回引用,后置返回值(参数int占位) |

示例:

class Complex {
  double re, im;
public:
  Complex operator+(const Complex&) const; // 成员
  friend ostream& operator<<(ostream&, const Complex&); // 友元
};

最佳实践:保持语义自然,避免滥用(如重载&&和||会失去短路求值特性)。