重载运算符应返回新对象而非修改this,加减法用const成员函数和const引用参数,乘除需检查边界并避免返回引用;混合类型运算须用友元函数,构造函数应explicit以防隐式转换。

重载 operator+ 和 operator- 要返回新对象,别改 this
常见错误是直接修改当前对象再返回 *this,这会让 a + b 改变 a,完全违背加法语义。正确做法是创建临时对象,计算后返回值(不是引用)。
- 返回类型必须是类类型(或
const类型),不能是void或引用(除非你明确想支持链式赋值,但加减法一般不这么做) - 参数通常用
const&避免拷贝:比如MyClass operator+(const MyClass& other) const - 如果需要支持
int + MyClass,得在类外写非成员函数:MyClass operator+(int lhs, const MyClass& rhs)
operator* 和 operator/ 要处理零值和异常边界
乘除比加减更容易出错——尤其是除法。重载 operator/ 时,this->value 为 0 是合法的,但若被除数为 0 就得自己检查。C++ 不会自动抛异常,全靠你判断。
- 除法建议显式检查除零:比如
if (other.value == 0) throw std::runtime_error("division by zero"); - 乘法要注意溢出:如果是
int成员,std::numeric_limits<int>::max()可用来预判 - 不要返回引用:
operator*的结果是新值,返回*this或局部变量引用都会导致未定义行为
成员函数 vs 友元函数:什么时候必须用 friend?
当运算符需要访问私有成员,且左操作数不是当前类(比如 5 * obj),就不能只靠成员函数解决——因为成员函数的隐式 this 总是左操作数。这时必须用非成员 friend 函数。
- 成员版
operator+只能处理obj + 5,不能处理5 + obj - 写成
friend MyClass operator+(int lhs, const MyClass& rhs)才能支持左值为内置类型的表达式 - 友元函数定义可放在类内(简化实现),但声明仍需加
friend关键字
别忘了 const 正确性与隐式转换陷阱
如果你允许 MyClass 从 int 构造(比如 MyClass(int x)),那 obj + 5 会先构造临时 MyClass,再调用 operator+。这本身没问题,但若构造函数没加 explicit,就可能引发意外转换,比如 if (obj == 1) 意外触发构造。
立即学习“C++免费学习笔记(深入)”;
- 二元运算符函数本身应加
const限定(const成员函数),表明不修改对象状态 - 所有涉及右值的参数都该用
const T&,否则无法绑定到临时对象 - 如果类有指针成员或动态资源,记得检查深拷贝问题——运算符返回值会被拷贝,拷贝构造函数得正常工作
实际写的时候,最容易漏的是友元函数对称性支持和除零检查;一旦涉及混合类型运算,explicit 和 const 的位置稍错一点,编译器报错信息就又长又绕。


















