在 C 面向对象编程中运算符重载是赋予自定义类型与内置类型一致操作体验的核心机制。它让我们能够用 、-、、 等直观的运算符操作对象极大提升了代码的可读性和自然性。本文将从基础概念出发深入讲解赋值运算符重载的要点并通过完整的日期类实现带你掌握运算符重载的实战技巧。一、运算符重载基础1.1 什么是运算符重载运算符重载的本质是函数重载它允许我们为自定义类型重新定义已有运算符的行为。编译器会根据操作数的类型自动调用对应的重载函数。1.2 重载规则与限制• 不能发明新运算符只能重载 C 已有的运算符如 、-、*、/ 等• 不能改变运算符的优先级和结合性比如 * 永远比 先计算• 不能改变操作数个数二元运算符重载后仍是二元一元仍是一元• 至少一个操作数是自定义类型不能重载两个 int 之间的 运算• 部分运算符不可重载.、.*、::、?:、sizeof 等1.3 两种重载形式运算符重载有两种实现方式成员函数和全局函数。形式特点适用场景成员函数隐含this指针作为左操作数参数少一个一元运算符、赋值类运算符全局函数参数列表完整需要访问私有成员时声明为友元二元运算符左操作数可能不是本类对象二、赋值运算符重载赋值运算符 是最特殊也最容易出错的运算符它必须作为类的成员函数重载不能是全局函数。2.1 为什么需要重载赋值运算符编译器会为每个类生成默认的赋值运算符执行浅拷贝按位复制。当类中包含指针、动态分配的资源时浅拷贝会导致• 多个对象指向同一块内存• 析构时重复释放• 一个对象修改会影响另一个对象这时候就需要我们手动重载赋值运算符实现深拷贝。2.2 赋值运算符重载的标准写法2.3 三个关键要点1. 返回值是引用返回 *this 的引用支持 a b c 连续赋值2. 检查自我赋值避免 a a 时释放了资源又去访问已释放的内存3. 先释放后分配先清理自身旧资源再分配新空间拷贝数据2.4 更安全的现代写法复制并交换异常安全的赋值运算符推荐使用 copy and swap 手法这种写法天然异常安全且自动处理自我赋值是 C 中的最佳实践之一。三、日期类完整实现下面我们通过一个完整的 Date 类综合运用各种运算符重载涵盖比较运算符、算术运算符、自增自减运算符、输入输出运算符等。3.1 类的定义3.2 比较运算符实现比较运算符建议基于 和 来实现其他运算符减少重复代码。3.3 日期加减运算3.4 自增自减运算符前置和后置的区别在于参数后置多一个 int 占位参数。3.5 赋值运算符与输入输出3.6 测试代码四、总结与最佳实践1. 能成员就成员必要时友元赋值、下标、函数调用运算符必须是成员输入输出运算符必须是友元全局函数2. 保持语义一致性 就该做加法不要写反直觉的逻辑3. 遵循内置类型的行为前置返回引用、后置返回值赋值返回自身引用4. 复用代码用 实现 用 和 实现所有比较运算符5. 警惕自我赋值凡是涉及资源释放的赋值运算符都要检查自我赋值运算符重载是 C 强大表现力的来源之一用好它能让你的类用起来像内置类型一样自然。但也要避免滥用只有当运算符的含义清晰直观时才使用否则不如用普通成员函数更明确。