重载 operator+ 应返回值类型 t 而非局部对象引用,避免悬垂引用;operator== 必须为 const 成员函数且参数为 const 引用,签名是 bool operator==(const t& other) const;operator!= 应复用 == 实现。

重载 operator+ 时别返回局部对象的引用
返回 const T& 或 T& 给临时对象是常见崩溃源头。比如在 operator+ 里返回 return temp;(temp 是栈上局部变量),调用方拿到的就是悬垂引用。
- 正确做法:直接返回值类型
T,让编译器决定是否启用返回值优化(RVO) - 如果真想避免拷贝(比如
T很大),改用移动语义:return std::move(temp);,但前提是temp是可移动的局部变量 - 千万别写
return *this;或return other;来“省事”——加法不该修改任一操作数
operator== 必须是 const 成员函数且参数也 const 引用
否则 std::vector<t>::find()</t>、std::set 插入等标准库操作会编译失败,因为它们传入的是 const T&。
- 签名必须是:
bool operator==(const T& other) const - 如果定义了
operator!=,别手写逻辑,直接return !(*this == other);,减少维护负担 - 注意:C++20 的三路比较(
operator)能自动生成==和等,但要求所有成员都支持比较,且不适用于需要自定义相等逻辑的场景(比如浮点容差比较)
重载输入输出运算符必须声明为非成员函数
operator 和 <code>operator>> 左操作数是 std::ostream 或 std::istream,不可能是你的类,所以不能写成成员函数。
- 必须声明为
friend或在类外定义,且第一个参数是流对象:std::ostream& operator - 如果要用
private成员,就加friend std::ostream& operator 声明 - 别忘了返回
os,否则无法链式调用:cout - 输出函数里别用
std::endl——它强制刷新缓冲区,影响性能;用'\n'更合适
前置递增 ++i 和后置递增 i++ 的实现差异很关键
后置版本必须返回旧值,因此要拷贝一份再修改,而前置版本直接改完返回自身引用——这是性能和语义的根本区别。
立即学习“C++免费学习笔记(深入)”;
- 前置:
T& operator++() { ++data_; return *this; } - 后置:
T operator++(int) { T old = *this; ++data_; return old; }(注意参数int是唯一标识后置的占位符) - 别把后置写成
return *this++;——这会无限递归调用自己 - 如果类资源昂贵(比如含动态数组),后置必然有一次拷贝;接受这点,别试图“优化”成返回引用
运算符重载真正难的不是语法,是搞清每个运算符背后的语义契约——比如 + 不该改变操作数,== 要满足自反性对称性,++ 的前后置行为边界在哪。契约破了,别人用你写的类时出的错,往往根本看不出是重载惹的祸。










