重载 operator== 时应使用 const myclass& 参数并加 const 限定符,推荐友元形式以支持隐式转换;含指针需深比较,含标准容器可直接用 ==。

重载 operator== 时必须注意 const 和参数类型匹配
非 const 成员函数无法被 const 对象调用,而比较运算符理应不修改对象状态。常见错误是写成 bool operator==(MyClass& other),导致 const MyClass a, b; if (a == b) 编译失败。
- 左侧参数应为
const MyClass&,右侧同理,整个函数加const限定符 - 推荐统一使用友元形式(尤其涉及隐式转换时),避免左侧参数被强制转换而右侧不能
- 若类有指针成员或动态资源,需深比较;若含
std::vector等容器,直接用==即可,无需手动遍历
重载 operator 必须返回 <code>std::ostream& 并声明为友元
流插入运算符不能是成员函数——因为左侧是 std::ostream,不是你的类。强行写成成员函数会导致 cout 找不到匹配的 <code>obj.operator。
- 必须定义为非成员函数:
std::ostream& operator - 通常需访问私有成员,所以加
friend声明(写在类内) - 末尾必须返回
os,否则链式调用如cout 会中断 - 不要在函数里 flush(如写
os ),那属于用户控制逻辑
重载赋值运算符 operator= 要处理自赋值和异常安全
默认生成的赋值运算符是逐成员浅拷贝,对含裸指针或资源句柄的类极危险。手写时漏掉自赋值检查(if (this == &other) return *this;)会导致释放自身内存后又尝试读取已释放区域。
- 函数签名应为
MyClass& operator=(const MyClass& other),返回引用以支持链式赋值 - 先释放当前资源,再分配新资源——但若 new 抛异常,对象将处于无效状态;更稳妥的是“拷贝-交换”惯用法(copy-and-swap)
- 若类管理文件句柄、mutex 或 unique_ptr,优先用 RAII 容器替代裸资源,可省去大部分手写逻辑
前置++与后置++ 的实现差异常被混淆
前置版本(++obj)应返回引用,后置版本(obj++)必须返回旧值的副本,且编译器靠哑元 int 参数区分二者。写反了会导致语义错乱或编译失败。
立即学习“C++免费学习笔记(深入)”;
- 前置:
MyClass& operator++() { /* 修改 *this */ return *this; } - 后置:
MyClass operator++(int) { MyClass tmp(*this); ++(*this); return tmp; } - 后置版本性能略差(多一次拷贝),除非接口需要,否则优先提供前置版本
- 如果类不可拷贝(如含
std::unique_ptr),后置++ 需显式定义为删除或用移动语义优化
重载运算符不是语法糖练习,每个重载都对应真实使用场景下的行为契约。最易被忽略的是 const 正确性、资源生命周期和异常边界——这些地方一出问题,往往表现为偶发崩溃或静默逻辑错误,而不是编译报错。









