加法运算符重载必须是类的成员函数或友元函数,否则因无法访问私有成员而编译失败;成员函数适用于左操作数为类对象的情形,友元函数支持左操作数为内置类型;返回值应为按值返回的新对象,禁止返回局部引用或void;成员版本需声明const以支持常量对象相加,operator+与operator+=需分别实现。

加法运算符重载必须是类的成员函数或友元函数
直接在类外定义 operator+ 且不声明为友元,编译会报错:无法访问私有成员。C++ 要求至少一个操作数是类类型,且重载函数必须与该类有关联——要么是成员函数(隐式访问 this),要么是友元函数(显式授权访问私有字段)。
常见错误现象:error: invalid operands to binary expression ('MyClass' and 'MyClass'),本质是找不到匹配的 operator+ 声明。
- 若左操作数是当前类对象(如
a + b),优先用成员函数:MyClass operator+(const MyClass& other) const - 若想支持
int + MyClass这类左操作数非类类型的表达式,必须用友元函数:friend MyClass operator+(int lhs, const MyClass& rhs); - 成员版本自动获得
this指针,友元版本需显式写出两个参数
返回值类型不能是 void,通常返回值而非引用
返回 void 会导致无法链式使用(如 a + b + c),而返回引用(MyClass&)极易引发悬垂引用——因为返回的是局部对象的引用。标准做法是按值返回新对象。
示例中常见错误:MyClass& operator+(...) 编译可能通过,但运行时行为未定义。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 返回
MyClass是安全且符合直觉的:构造临时对象并返回其副本 - 现代 C++ 编译器会自动应用返回值优化(RVO),避免多余拷贝
- 不要试图返回
*this或局部变量的引用
const 正确性决定能否参与常量表达式
如果重载函数没加 const 限定符,就不能用于常量对象相加,比如 const MyClass a, b; auto c = a + b; 会编译失败。
成员函数版本必须声明为 const,表明它不修改当前对象状态;友元函数天然不绑定 this,无需此修饰,但参数应尽量用 const& 避免无谓拷贝。
- 成员版签名应为:
MyClass operator+(const MyClass& other) const - 友元版签名示例:
friend MyClass operator+(const MyClass& lhs, const MyClass& rhs) - 即使内部只读取成员,缺
const也会导致 const 对象调用失败
重载 operator+ 不影响内置类型行为,也不自动提供 +=
operator+ 和 operator+= 完全独立。实现 + 不等于有了 +=,后者需要单独重载,且惯例是返回 *this& 以支持链式赋值。
容易被忽略的一点:重载只对自定义类型生效。你无法用它改变 int + int 的行为,也不能让 std::string + MyClass 自动工作——除非你显式提供对应友元函数。
- 想支持
MyClass + std::string?得写:friend std::string operator+(const MyClass& m, const std::string& s); - 想让
+=可用,必须另写:MyClass& operator+=(const MyClass& other) - 所有重载都只在作用域内可见;跨文件使用需确保声明被包含
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










