C++中类的6个默认成员函数

首先,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 ,保存当前的值,然后++再返回之前的值,就没有前置效率高啦,所以推荐用前置昂

这里还有一个坑呢,我+=是不是还没实现嘞,这个问题就留给你们了哈,😁😁😁

最后两种分别是移动构造函数,和移动赋值运载符重载,这两种用的太少啦,就不做过多介绍了呢,可以查查文档呢,也很简单啦。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值