重载 operator+ 应返回 const 对象以防止 a + b = c 的非法赋值;推荐非成员函数实现,避免隐式转换限制;operator== 与 != 应成对定义或使用 C++20 default;operator[] 需 const/non-const 重载支持读写;语义不清时应避免重载,优先命名函数。

重载 operator+ 时为什么返回 const 对象?
因为非 const 返回值可能被误用为左值,比如 a + b = c 这种非法赋值——编译器不会报错,但语义错误。返回 const T 能在编译期拦住这类问题。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 二元
operator+推荐声明为非成员函数(friend或全局),避免隐式转换只作用于左侧参数 - 如果必须是成员函数,注意它只能把
this当左操作数;int + MyType会失败,除非提供额外的非成员版本 - 不要返回局部对象的引用,常见坑:
return *this;在临时对象上出错;应返回值(T)而非T&
operator== 和 operator!= 必须成对定义吗?
不是必须,但强烈建议。C++20 前,只定义 operator== 不会自动生成 operator!=;用户手写 != 时若逻辑不一致(比如一个用 memcmp,另一个逐字段比),会导致行为不一致。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- C++20 起可用
default:声明bool operator==(const T&) const = default;,编译器自动合成==和!= - 手动实现时,
operator!=应直接写return !(*this == rhs);,别重复写比较逻辑 - 注意
const修饰符:两个操作符都必须是const成员函数,否则const T a, b; a == b编译不过
重载 operator[] 怎么同时支持读和写?
靠 const/non-const 重载区分:一个返回 const T&(只读),一个返回 T&(可写)。编译器根据调用对象是否 const 自动选函数。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 非 const 版本不能调用 const 版本并强制转型返回引用——这破坏 const 正确性,且可能返回临时对象的引用
- 内部要做边界检查?统一抽到私有函数里,避免重复逻辑;抛异常还是静默处理,需按类契约决定
- 如果容器支持越界访问(如
std::vector::operator[]不检查),你的实现也应保持一致行为,别偷偷加检查破坏性能预期
什么时候不该重载运算符?
当重载后语义模糊、违背直觉,或只是“为了用而用”时,就该停手。比如给 class NetworkRequest 重载 operator+,没人知道这是拼 URL、合并 headers,还是发起两次请求。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 优先考虑命名函数:用
merged_with()比operator+更清晰 - 避免重载
operator&&/operator||:无法短路求值,行为与内置运算符不一致,极易引发 bug - 重载
operator->或operator*前,先确认你真在写智能指针类;普通业务类加这些,只会让调用方困惑
最常被忽略的一点:重载运算符后,要同步更新拷贝/移动构造、赋值、析构的实现逻辑——尤其是涉及资源管理时,operator= 没处理自赋值,或者没释放旧资源,一用就崩。









