operator=必须返回MyClass&并检查自赋值;+、==等二元运算符宜用const&参数的非成员friend函数实现;++需区分前置(返回引用)与后置(返回值);[]和()须提供const与非const双版本。

operator= 必须返回 MyClass&,且要处理自赋值
重载赋值运算符不是简单地复制成员变量。它本质是“深拷贝 + 释放旧资源”,必须返回引用以支持链式赋值(如 a = b = c)。最常被忽略的是自赋值检查:a = a 会导致先 delete 再访问已释放内存。
- 在函数开头加
if (this == &other) return *this; - 先分配新资源、拷贝数据,再
delete旧资源(即“复制-交换”或“先new后delete”策略) - 不要在
operator=中调用delete this或手动调用析构函数
二元运算符如 +、== 建议用非成员函数实现
非成员函数能保持左右操作数类型对称,尤其当左侧是字面量或隐式可转换类型时(比如 5 + obj)。成员函数版本只能让 obj + 5 成立,5 + obj 会编译失败。
- 声明为
friend函数可访问私有成员,例如:friend MyClass operator+(const MyClass& a, const MyClass& b);
- 参数用
const&避免无谓拷贝 - 返回值通常是值类型(
MyClass),不是引用——临时对象不能返回引用
前置++和后置++必须区分:后者要带 int 占位参数
C++ 用函数签名区分前置与后置递增:前置是 MyClass& operator++(),后置是 MyClass operator++(int)。那个 int 不是真用来传参的,只是语法标记。
- 前置:修改自身并返回
*this(引用) - 后置:先保存原值副本,再调用前置版本,最后返回副本(值)
- 别写成
return *this++—— 这会无限递归
重载 [] 和 () 时,记得提供 const 版本
否则 const MyClass obj; obj[0] 会编译失败。非常规但高频踩坑点:这两个运算符常用于容器类,必须同时支持读(const)和写(non-const)语义。
立即学习“C++免费学习笔记(深入)”;
- 写两个版本:
T& operator[](size_t i)和const T& operator[](size_t i) const - 避免重复逻辑:让 non-const 版本调用 const 版本再
const_cast(仅当内部数据确实可变时才安全) -
operator()若用于仿函数,通常只实现 non-const 版本即可;但若封装了状态且需在 const 上下文中调用,就得加mutable或提供 const 重载










