C++小结之再结一次

默认构造函数

默认构造函数是C++的一个特点,它会自动调用,很省心,同时它也有很多种。

构造函数

它的特点就是名字和类名一样,且没有返回值,初始化类的时候会自动调用它,在里面一般写的内容是初始化的信息,因为C语言没法对自定义类型自动初始化,所以估计才有了它。

它还有一个特点,就是我们不写,系统会自动写一个,而我们写了,系统就不写了。但是系统写的都挺坑的,就拿上面的代码来说,我们自己写的可以给我们要的值,系统写的就直接是随机值了。

所以为了以后能偷懒,这里还是自己写靠谱一点。同时,默认构造和我上面说的默认构造函数它意思不完全一样, 构造函数是可以没有参数的,所以,C++把无参的构造函数,系统写的构造函数,全缺省的构造函数称为默认构造,这是个比较容易混淆的点,需要区分,而默认构造这三个写法,其实它们只能同时存在一个。

析构函数~

既然有初始化,那就有删除,析构就是这个作用,它会在生命周期结束时自动调用,但是它就比构造简单的多,默认类型它不管,遇到自定义类型它就动起来了,当然它也是我们不写系统会写,不过正常的情况我们是完全可以信任系统写的,除非我们自己开了空间需要我们手动释放它,这样就要我们自己写了。

它和构造函数的命名都一样 只是多了个 ~ 符号 ,就你tab上面那个波浪号,它必须得在函数名前面,而它的函数名和构造函数一样都是类名,也没有返回值,也是自动调用。

 

拷贝构造

听这名字都知道它是拷贝用的,但是它和C的拷贝不一样,C没有自定义类型拷贝的烦恼,直接浅拷贝就好,也就是一个一个字节拷,确实都一样了,但是我C++自定义类型要是开了空间咋办,你地址也一个个拷走,那我调用析构就会出问题了。所以C++搞了个拷贝构造出来,你的数据我照抄,但是我自个开个地址存,以免报错。

它不会自动调用,它会在你满足它的条件时自动触发。

1 当用类的对象去初始化这个类的另一个对象时。

2 将一个对象作为实参传递给另一个非引用形参时,系统也会自动调用拷贝构造。

3 返回值作为非引用返回时,系统也会调用拷贝构造。

需要注意的是,就是因为第二点,所以咱要用引用传参,不然会无限的触发拷贝构造,进而演变为死循环,既然咱传引用,那么在不改变它的时候,我们可以加一个const保险,以免我们主动被动的修改。

第三点虽然不会造成死循环,但是传引用可以减少一次拷贝构造,可以提高效率何乐而不为。

this指针

如果我们创建了多个同类型的变量,系统拿啥区分呢,其实每次调用构造都会有一个隐藏的this指针,它就是你这个变量的地址,以此确定你是你,同时为了预防主动被动的修改它,所以它是const类型修饰的,且不能更改,甚至咱连this都不能写,因为它是隐藏的。但是我们可以在类里面显示的写,不写系统也能识别就是了,所以它一般是作为返回值,比如返回个*this,同时它再牛也只是个形参,出了生命周期就结束了,所以形参需要注意的它也要注意。

运算符重载operator

这里需要用到一个关键字 operator  ,它直接加运算符就可以构成重载,但是并不是什么都能加,也不是可以创造运算符,一般就用到+-*/=这些。

就像这样,对与不涉及改变的,我们应该加个const保护。

同时运算符重载也是支持复用的,比如我已经写好了一个 < 的重载,那么大于的重载我就可以用 < 取反来偷懒。但是不能套娃,比如大于复用小于,小于复用大于,这是不行的,至少得把基础的写了才行。

但是对于双操作数的运算符,比如 + 这种,它应该要有两个参数,但是如果你去写了两个参数你就会发现报错,因为我们上面提到的this也占了一个,那该咋办呢。

没错,那就只传后面的就好了,因为this它也能代表一个操作数,且在类里我还能用它,所以问题又被解决了。

运算符重载的调用也很接地气

你甚至可以 d1 < d2 ,它也能识别的出来。

友元friend

我们之前提到过,类里面的东西可能有私有的,那外面是访问不到的,那总会有就是要外访问内的情况,这时候就要用友元了 friend + 声明 ,它就能在外访问私有了。比如我写了流插入和流提取,但是我在外面访问不到里面。

这样就能访问了。

但是,我类想访问流插入或者流提取是不行的,友元是单向的,想要双向就得两边都友元。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值