C++操作符重载的规则与最佳实践
请说明C++中操作符重载的基本规则、限制、常用实现方式(成员函数 vs 非成员函数),以及典型操作符(+,<<,++,[] ,())的重载示例。
回答
编译有声
基本规则:
- 不能创建新操作符,只能重载现有操作符(共40余个)。
- 不能改变操作符的优先级、结合性和操作数个数。
- 不能重载的运算符:
::.*.?:sizeoftypeid。 - 至少一个操作数是用户定义类型(防止重载int+int)。
成员函数 vs 非成员函数: | 运算符 | 推荐方式 | |--------|--------| | =, [], (), -> | 必须为成员函数 | | +=, -= 等复合赋值 | 通常为成员函数 | | 双目运算 +, -, *, / | 非成员函数(支持左右类型转换对称性) | | << (输出) | 非成员函数(需访问private成员时声明为friend) | | ++, -- | 前置返回引用,后置返回值(参数int占位) |
示例:
class Complex {
double re, im;
public:
Complex operator+(const Complex&) const; // 成员
friend ostream& operator<<(ostream&, const Complex&); // 友元
};
最佳实践:保持语义自然,避免滥用(如重载&&和||会失去短路求值特性)。