运算符重载指南
更新时间:2026-10-01。重载的目标是让类型用起来像内建类型,而不是炫技。
一、成员还是自由函数
赋值/下标/调用/箭头必须成员;二元算术与流插入用非成员才能对两侧做对称转换;复合赋值 += 常做成员,+ 复用它实现。
二、现代比较
cpp
struct V { int a,b; auto operator<=>(const V&) const = default; };默认三向比较一次声明即得到全部六个关系运算;不默认 == 时需留意是否需要单独 operator==。

常见坑
- 重载
&&、,、&破坏短路/求值顺序语义。 operator+就地修改左值。- 转换运算符过度提供造成隐式二义。
小结
总结
运算符重载的目标是让自定义类型用起来像内建类型、而非炫技:=、[]、()、-> 必须是成员,对称的二元算术和流插入(+/-/<<)应做成非成员友元以保证左操作数也能隐式转换(复合赋值 += 做成员、+ 复用它);语义要贴合内建直觉(+ 返回新对象、+= 返回 *this、区分前置/后置 ++),C++20 用 operator<=> 一次声明默认生成全部关系运算;不要重载 &&、逗号、取址等会破坏短路与求值顺序的冷门运算符,并克制使用转换运算符。