首先,C++中定义了类(class),相似于C中的struct,只不过他俩的默认访问权限不同,class的默认访问权限是private,而struct的默认访问权限是public。

每一个类中都会有6个默认成员函数,记住嗷,默认成员函数只能定义在类内!!!不能定义在类外,如果在类外定义的话,类内会以为没有默认成员函数,会生成一个无参滴,就会造成冲突呀,要是你调用,那到底访问哪一个嘞?是不是这么个理儿
咱先写一个日期(Data)类

现在里面儿只有三个成员变量,年月日,接下来一起补充他的默认成员函数吧~
注:!其实你什么都不写的话,它也是会自己生成的,但是对内置类型成员(例如 int char double 等)不做处理!!!对自定义类型成员(例如自己定义的class struct等)会去自动调用他的默认成员函数。
首先,咱们来看看第一个默认成员函数——构造函数。
构造函数是干什么的呢?其实精髓全在 ‘造’ 这个字,其实就是创造的时候调用,也就是初始化函数。
构造函数的名字和类名相同!而且这些默认构造函数是没有返回值的,你也不用写昂~

看吧,这个就是大名鼎鼎滴构造函数啦。其实很简单滴,这里函数参数给了缺省值,所以就不需要定义空参的构造函数啦,相反,你要是给了!他还会出问题,你想想,如果你定义一个Data d1,那他会调用那个呢?是不是冲突啦~
这块儿还有一个知识点就是,其实这些类内的函数,第一个参数,都默认传了一个this指针,不然他怎么访问类内的成员变量嘞,所以他那些_year的访问,其实都是简写,完整应该是

都是this指针访问成员变量。
第二种!析构函数~
刚才咱们构造了函数,那是不是结尾也应该对它负责呢,所以就有了析构函数,他其实就是干销毁工作的,他会在对象销毁的时候,自动调用昂,完成对象中资源的清理过程。
他的名字就是~+类名

其实这个析构函数,有点没有意义,这儿我又没申请空间啥的,本来这些变量在函数结束的时候,是不是就自动清理啦,所以可以考虑让编译器自己生成的,接下来咱们看看栈的析构函数:

这块儿就写了Stack的构造函数和析构函数,这里你看~这个析构函数其实跟咱们之前写的StDestory挺相似的,但是之前咱写栈的时候,你要考虑各种可能突然终止的情况,再必须调用StDestory,如果不调用,那么就会产生内存泄露,但是析构函数就不一样啦,它会在每次函数生命周期结束的时候自动调用!就很棒~
一般情况下,有动态申请资源才需要写析构,如果没动态申请,就不需要啦
第三类:拷贝构造函数
你听听,他的名字,也有构造,但是区别是,他是拷贝,对啦,他就是拷贝对象A,用来初始化对象B,所以A和B就跟双胞胎似的。
拷贝构造是构造函数的一个重载形式昂~

注意啦,这块儿!你想想,参数这儿,为什么是传址引用,而不是传值引用…………
值传递引发的递归:如果拷贝构造函数的参数是非引用类型(比如写成 Date(const Date d) ),那么传递实参 d1 给形参 d 时,又会触发拷贝构造函数的调用(因为要复制 d1 到 d ,而复制自定义类型对象会调用其拷贝构造函数)。如此循环,就会导致无穷递归,最终编译报错或运行时栈溢出。
归根结底,还是一句话,形参是实参的一份临时拷贝!!!所以这块儿传值的话也会引发一个拷贝构造函数。
所以切记嗷!一定要传引用昂!
第四类:赋值运算符重载
C++中提供了运算符重载,这个相当厉害了嗷,比如你说,咱们的自定义类型Data,如果10.21是你跟对象的纪念日,你这时候想着要提前准备礼物了,得算算10月21日-100,是哪一天,这时候直接用–号行嘛,是不是不太行呢,所以你可以重载一下这个 ‘-’ 号,达到咱的目的~
函数名字:operator后面直接跟运算符号
函数原型:返回值类型operator操作符()
注意:
① . 这个点和::和sizeof和?:和 .*这五个运算符是不支持重载的昂
②他的形参比操作数数目少1,因为默认有一个this指针嘛
③重载操作符必须有一个类类型参数
接下来就先来实现 -=符号的重载吧

这就是我每次加上当前月的天数,然后如果他≤0,那就给我进去,月份--,加上当月的天数,依次循环。
这儿还得知道每个月有多少天,得搞一个获得每月天数的函数

最后咱就来实现实现 - 的重载运算,这就可以用-=啦

这就是-的运算符重载实现啦,其实这儿不是不是给this带个const更好呢。
接下来还有一个就是前置++,后置++的区别,这两个怎么区分呢?
很简单啦,就是构成重载函数呗~~给后置++的函数加了一个参数int,用的时候它会自动识别滴

这个就是前置++滴实现啦,要改变这个数据,所以用传引用返回呢

而这个后置++,相对来说,效率就要低一点了,他还得先拷贝构造出一个temp ,保存当前的值,然后++再返回之前的值,就没有前置效率高啦,所以推荐用前置昂
这里还有一个坑呢,我+=是不是还没实现嘞,这个问题就留给你们了哈,😁😁😁
最后两种分别是移动构造函数,和移动赋值运载符重载,这两种用的太少啦,就不做过多介绍了呢,可以查查文档呢,也很简单啦。
3070

被折叠的 条评论
为什么被折叠?



