operator+和operator-必须返回值而非void,成员函数需加const限定符以支持常量对象,全局函数参数应为const引用,且须正确处理资源管理与移动语义。

重载 operator+ 和 operator- 必须返回值,不能是 void
常见错误是写成 void operator+(const MyClass& other),结果调用 a + b 后没法赋值、没法链式使用,甚至编译失败。C++ 要求二元运算符重载函数要么是类的成员函数(左操作数是当前对象),要么是全局函数(常需声明为 friend),但无论哪种,返回类型必须是合理值——通常是新构造的对象。
- 成员函数形式:返回
MyClass(推荐,语义清晰)或MyClass&(仅当不创建新对象时,极少适用) - 全局函数形式:参数两个
const MyClass&,避免拷贝开销,返回MyClass - 别返回局部对象的引用,比如
return *this;在临时对象上会悬垂
const 修饰不到位导致编译失败
如果类里有 const 成员变量,或者你希望支持对常量对象做加减(比如 const MyClass a, b; auto c = a + b;),那 operator+ 成员函数必须加 const 限定符;否则编译器拒绝绑定 const 对象到非 const 成员函数。
- 正确写法:
MyClass operator+(const MyClass& other) const - 错误写法:
MyClass operator+(const MyClass& other)—— 遇到const左操作数就报错 - 全局函数不用加
const,但两个参数都应是const MyClass&
加减法语义不一致引发逻辑 bug
用户不会只看函数名,而是按数学直觉用。比如 a - b 应等价于 a + (-b),如果 operator- 手动实现但没和 operator-(一元负号)或 operator+ 对齐,后续组合运算就会出错。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 优先复用已有逻辑:在
operator-里调用operator+和一元operator-,而不是重复写一遍字段计算 - 注意交换律:加法一般可交换,减法不可。成员函数版本的
a + b中a是隐式this,b是参数;若想支持int + MyClass,必须用非成员函数,并声明为friend或放开构造函数隐式转换(谨慎) - 如果类含指针或资源,记得深拷贝——重载运算符默认不处理资源管理,
operator+返回新对象时,其内部指针若浅拷贝,析构时会 double-free
移动语义没打开,性能白白损失
现代 C++ 中,operator+ 返回临时对象,编译器本可自动触发移动构造,但前提是你的类实现了移动构造函数和移动赋值运算符,且没有显式删除或禁用。
- 没写移动函数?编译器可能只调用拷贝构造,尤其在返回局部对象时
- 写了但没加
noexcept?某些标准库容器或算法可能退回到拷贝路径 - 简单验证方法:在移动构造函数里加日志,看
a + b是否真走了移动而非拷贝
运算符重载不是语法糖练习,它是把类真正接入 C++ 表达式体系的接口。最容易被忽略的是 const 正确性和资源所有权转移——这两点不出现在编译错误里,但会在某个深夜调试时突然咬你一口。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!









