重载 operator+ 必须返回新对象而非引用,正确写法是 myclass operator+(const myclass& a, const myclass& b);推荐用全局非成员函数实现,参数和内部调用的成员函数均需 const;应先实现 operator+= 再复用其实现 operator+。

重载 operator+ 必须返回新对象,不能返回引用
很多人写成 MyClass& operator+(const MyClass& a, const MyClass& b),编译可能过,但运行时大概率出问题——因为返回的是局部对象的引用,函数一结束内存就释放了。正确做法是返回值,不是引用。
- 返回
MyClass(值语义),让编译器决定是否启用 RVO 或移动构造 - 如果类很大,确保已定义移动构造函数,避免不必要的拷贝
- 不要在函数体内
return *this或return a这类直接返回参数引用的操作
MyClass operator+(const MyClass& a, const MyClass& b) {
MyClass result;
result.value = a.value + b.value; // 假设有个 value 成员
return result; // ✅ 安全返回值
}
成员函数 vs 全局函数:什么时候该用哪个
重载 operator+ 推荐用全局非成员函数,除非需要访问私有成员且不希望加 friend 声明;而 operator+= 必须是成员函数——因为它要修改左操作数。
-
operator+是对称操作:两个操作数地位相同,全局函数更自然(比如支持int + MyClass的隐式转换) - 如果
MyClass有私有成员,全局版本需声明为friend,或提供公共访问接口(如get_value()) - 成员版
operator+隐含*this为左操作数,无法支持左操作数为其他类型(如5 + obj)
常见错误:忘记 const 引用参数和 const 成员函数
不加 const 会导致临时对象、字面量、常量对象无法参与运算,比如 obj + MyClass(42) 直接编译失败。
- 两个参数都必须是
const MyClass&,否则无法绑定到右值 - 如果在
operator+内部调用了类的其他成员函数,那些函数也得是const的(否则编译报错) - 别写成
MyClass operator+(MyClass a, MyClass b)——这会触发两次无谓拷贝
和 operator+= 配合使用能减少重复逻辑
标准做法是先实现 operator+=(成员函数),再用它实现 operator+(全局函数)。这样逻辑集中,不易出错,也利于后续维护。
-
operator+=修改当前对象并返回*this(引用) -
operator+复制左操作数,再调用+=,最后返回副本 - 注意:复制构造函数必须可用;若类禁止拷贝(如含
std::unique_ptr),就得依赖移动构造
MyClass& MyClass::operator+=(const MyClass& other) {
value += other.value;
return *this;
}
MyClass operator+(MyClass a, const MyClass& b) { // 注意:a 是值传入
a += b;
return a;
}
C++ 运算符重载真正麻烦的不是语法,而是值语义和资源管理的配合——比如类里有裸指针或文件句柄时,operator+ 返回的新对象到底该深拷贝还是共享,稍不注意就是悬空指针或 double-close。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










