【C++】类和对象--运算符重载与赋值

发布时间:2026/7/15 4:09:31
【C++】类和对象--运算符重载与赋值 目录运算符重载规则赋值运算符重载默认生成赋值运算符的行为C允许对已有运算符赋予新的含义这让代码更加直观简洁。而赋值运算符operator的重载是类设计中需要重点关注的一环尤其是当类涉及资源管理时。运算符重载规则运算符重载本质上是一个特殊的函数命名格式为operator后接运算符符号。例如重载写成operator。重载需遵守以下规则不能新建原本不存在的运算符如**。至少有一个操作数是类类型不能改变内置类型运算符的含义。.*、::、sizeof、?:、.这五个运算符不能被重载。不能改变运算符的优先级和结合性。通常除了少数必须重载为全局函数的情况如流插入运算符大多数运算符建议重载为成员函数。成员函数版本左侧操作数默认为当前对象通过this传递参数比操作数少一个。赋值运算符重载赋值运算符是编译器默认生成的六个成员函数之一用于两个已存在对象之间的拷贝赋值。它的标准形式Toperator(constTobj);我们以一个日期类为例实现赋值classDate{public:Date(intyear1900,intmonth1,intday1):_year(year),_month(month),_day(day){}Dateoperator(constDated){if(this!d){// 防止自我赋值_yeard._year;_monthd._month;_dayd._day;}return*this;// 返回当前对象支持连续赋值}private:int_year,_month,_day;};设计要点分析参数使用const引用避免拷贝并保护原对象。返回值返回T以支持连续赋值d3 d2 d1。自我赋值检测通过if (this ! d)防止自己赋值给自己。对于简单的值类型即使不检测也多不会出错但一旦涉及资源释放再分配如先delete旧内存再拷贝自我赋值会导致严重后果。只能重载为成员函数如果试图重载为全局函数会和编译器自动生成的默认赋值运算符冲突。默认生成赋值运算符的行为与拷贝构造类似用户未定义时编译器会生成默认赋值运算符进行浅拷贝。对内置类型逐字节复制对自定义类型调用其自身的赋值运算符。因此对于需要深拷贝的资源管理类也必须显式重载赋值运算符Stackoperator(constStackst){if(this!st){free(_a);// 先释放原有资源_a(int*)malloc(sizeof(int)*st._capacity);memcpy(_a,st._a,sizeof(int)*st._top);_topst._top;_capacityst._capacity;}return*this;}至此我们完成了三大核心函数构造、析构、拷贝赋值。下一篇将把视角转向构造函数的进阶玩法——初始化列表和explicit关键字。