核心内容摘要
圣采儿:一场无声的泪水,揭示生命的真实与渴望
本次编译环境为VS2022文章目录前言
拷贝构造函数
赋值运算符重载
运算符重载
赋值运算符重载
总结前言在了解完类和对象中的 构造和析构函数后 我们开始了解类和对象的后续内容拷贝构造函数 赋值运算符重载
拷贝构造函数拷贝构造函数 顾名思义 是构造函数的一种 拷贝构造函数的的第一个参数 是自身类型的引用且 其他参数都有默认值拷贝构造函数的特点
它是构造函数的一个重载
它的第一个参数必须是自身类型的引用 不是的话 编译器会直接报错 且后面的参数得有缺省值
C规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造。
若未显式定义拷⻉构造编译器会⽣成⾃动⽣成拷⻉构造函数。
传值返回会产⽣⼀个临时对象调⽤拷⻉构造传值引⽤返回返回的是返回对象的别名(引⽤)没有产⽣拷⻉。
#define_CRT_SECURE_NO_WARNINGS1#includeiostreamusingnamespacestd;classDate{public:Date(intyear1,intmonth1,intday
{_yearyear;_monthmonth;_dayday;}Date(constDated)//拷贝构造{_yeard._year;_monthd._month;_dayd._day;}Date(Date*d)//指针类型的{_yeard-_year;_monthd-_month;_dayd-_day;}voidPrint(){cout_year-_month-_dayendl;}private:int_year;int_month;int_day;};voidFunc1(Date d){coutdendl;d.Print();}DateFunc2(){Datetmp(2026,7,
;tmp.Print();returntmp;}intmain(){Dated1(2026,7,
;Func1(d
;coutd1endl;Dated2(d
;d
Print();d
Print();Dated3(d
;d
Print();Date d4d1;d
Print();Date retFunc2();ret.Print();return0;}通过简单的代码给各位一个简单拷贝构造函数的 日期类可以看到 其也就相当于是初始化函数 只不过 其参数不同 有符号
赋值运算符重载
运算符重载运算符重载是具有特殊名字的函数它的名字是由operator和后面要定义的运算符共同构成的 它有返回类型 和参数列表以及函数体如果⼀个重载运算符函数是成员函数则它的第⼀个运算对象默认传给隐式的this指针因此运算符重载作为成员函数时参数⽐运算对象少⼀个。
通过简单的代码来了解classDate{public:Date(intyear1,intmonth1,intday
{_yearyear;_monthmonth;_dayday;}voidPrint(){cout_year-_month-_dayendl;}//private:int_year;int_month;int_day;};//若没有在类里面//掉private 则 赋值运算符重载 访问呢不了 _year等booloperator(constDated1,constDated
{returnd
_yeard
_yeard
_monthd
_monthd
_dayd
_day;}intmain(){Dated1(2026,1,
;Dated2(2026,1,
;intretoperator(d1,d
;coutretendl;return0;}这里我们看到我们通过创建类 并且用 operator 来展示运算符号重载最终 ret 0
赋值运算符重载
赋值运算符重载是⼀个运算符重载**规定必须重载为成员函数。
**赋值运算重载的参数建议写成const 当前类类型引⽤否则会传值传参会有拷⻉
有返回值且建议写成当前类类型引⽤引⽤返回可以提⾼效率有返回值⽬的是为了⽀持连续赋值场景。
没有显式实现时编译器会⾃动⽣成⼀个默认赋值运算符重载默认赋值运算符重载⾏为跟默认拷⻉构造函数类似对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉)对⾃定义类型成员变量会调⽤他的赋值重载函数。
像Date这样的类成员变量全是内置类型且没有指向什么资源编译器⾃动⽣成的赋值运算符重载就可以完成需要的拷⻉所以不需要我们显⽰实现赋值运算符重载。
像Stack这样的类虽然也都是内置类型但是_a指向了资源编译器⾃动⽣成的赋值运算符重载完成的值拷⻉/浅拷⻉不符合我们的需求所以需要我们⾃⼰实现深拷⻉(对指向的资源也进⾏拷⻉)。
像MyQueue这样的类型内部主要是⾃定义类型Stack成员编译器⾃动⽣成的赋值运算符重载会调⽤Stack的赋值运算符重载也不需要我们显⽰实现MyQueue的赋值运算符重载。
这⾥还有⼀个⼩技巧如果⼀个类显⽰实现了析构并释放资源那么他就需要显⽰写赋值运算符重载否则就不需要。
我们通过一个简单函数来实现classDate{public:Date(intyear1,intmonth1,intday