operator+ 必须定义为非成员函数以支持左操作数隐式转换(如 int + MyClass);若仅需 MyClass + MyClass,成员函数可行,但非成员版更通用且常声明为 friend。

operator+ 必须定义为非成员函数还是成员函数?
取决于是否需要左操作数是隐式转换类型(比如 int + MyClass)。如果只支持 a + b 且两个都是 MyClass,成员函数够用;但要支持 5 + obj,就必须用非成员函数(常配 friend),否则左操作数无法触发用户定义的转换。
常见错误:把 operator+ 写成成员函数后,写 5 + obj 报错 no match for 'operator+' (operand types are 'int' and 'MyClass') —— 因为成员版只能以 MyClass 为左操作数。
- 成员版签名:
MyClass MyClass::operator+(const MyClass& other) const - 非成员版(推荐):
MyClass operator+(const MyClass& a, const MyClass& b),通常声明为friend以便访问私有成员 - 若需支持混合类型(如
int + MyClass),非成员版可额外重载:MyClass operator+(int n, const MyClass& obj)
返回值类型为什么不能是 void 或引用?
operator+ 的语义是“产生新对象”,不是修改原对象。返回 void 会导致 a + b + c 编译失败;返回非 const 引用(如 MyClass&)会绑定到临时对象,引发悬垂引用;返回 const MyClass& 同样危险——你无法安全返回局部对象的引用。
- 正确返回类型:
MyClass(值语义,安全但可能有拷贝开销;C++17 后 RVO/NRVO 通常消除) - 不推荐返回
MyClass&&或引用,除非你明确控制生命周期(极少见) - 别为了“性能”强行返回引用——加法本就不该复用内存
const 和参数传递方式怎么选?
左值、右值、是否修改原对象,全靠 const 和引用限定符管住。不加 const 会导致无法对常量对象调用,比如 const MyClass a, b; auto c = a + b; 会失败。
立即学习“C++免费学习笔记(深入)”;
- 参数一律用
const MyClass&:避免拷贝,接受左值/右值 - 函数自身加
const(仅成员函数时):MyClass operator+(const MyClass& other) const - 非成员函数不用加
const,因为它本来就不属于任何对象 - 不要写
MyClass operator+(MyClass other)——多一次无谓拷贝
和 operator+= 配合使用更简洁
习惯上先实现 operator+=(成员函数,返回 MyClass&),再用它实现 operator+(非成员),代码更短、逻辑更清晰,也天然支持移动语义(C++11 起)。
MyClass& MyClass::operator+=(const MyClass& other) {
// 修改 this
return *this;
}
MyClass operator+(MyClass a, const MyClass& b) { // 注意:a 是值传入,自动启用移动(若传入右值)
a += b;
return a;
}
这个写法里,operator+ 的第一个参数用值传递,既支持拷贝也支持移动,编译器会自动选择最优路径。比手写两套(拷贝版 + 移动版)更可靠。
容易被忽略的是:如果 MyClass 有资源管理(比如动态数组),必须确保 operator+= 正确处理自赋值(a += a),否则 operator+ 在某些边界情况下会出错。









