一.运算符重载补充:
1.流插入运算符:
我们知道进行运算符重载这个函数的参数的左右类型是非常重要的,我们尝试在类中去定义这个流插入重载!
1.考虑到隐含的参数指针:
2.进行优化!
我们观察上面的代码发现可以实现在类中进行流插入运算符的一个重载但是我们需要考虑隐含参数的位置所以我们进行传参的时候就 写成了 == d1<<cout ==.
上面这个语句是非常奇怪的因为我们之前使用cout的时候把类型的数据插入到cout中但是上面这个就是把cout插入到d1中这是不好的!
没有人规定类的操作符必须要写在类中!
我们把函数定义到全局中-》出现了一个问题我们在全局中是找不到成员变量的!我们成员变量是私有的我们不希望成员变量不去使用成员函数而发生改变!
2-1:解决办法:友元
通过friend 关键字去在类中声明一个友元函数就可以解决,我是你的朋友可以访问私有的成员变量!
2-2:流插入一定满足连续?
我们通过前面的知识我们知道满足连续性这个函数就需要一个返回值!
3.总结:
其他的运算符一般是实现在成员函数中,但是流插入和流提取操作符是实现在全局的。
1.因为存在隐含的参数(影响了操作符的顺序)。
1-1:写在全局改变了函数传参的顺序并且满足了正常的cout的使用顺序!
2.写到全局访问不到私有的问题?
2-1:友元解决!
2.流提取运算符:
二.const 成员:
1.概念进入:
我们观察上面的代码会发现?
我们定义了一个const Date 类型的d2是不想要d2这个日期对象被修改但是我们的隐含参数默认是一个Date* 类型,所以参数列表不匹配!
通过将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
2.具体操作:
需要特别注意成员函数定义和声明分开的时候const都需要加上和缺省参数不一样!
3.参数变化:
3-1:权限下降!
4.成员函数const 原则:
1.可以定义成const 的成员函数都应该定义,这样const 和非const 对象都可以调用。
2.如果不去定义const 那么const类型的对象就不可以去进行成员函数调用!
3.如果有需要修改成员变量的函数不可以使用const去修饰!
三.构造函数补充:
1.初始化:
我们之前通过构造函数去初始化成员变量其实是一种赋值!
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称之初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
2.初始化列表:
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
3.作用:
1.const的初始化:
2.引用的初始化:
我们知道引用是必须需要初始化,第一次是地址,之后都是赋值!所以我们不可以让引用类型的成员变量在赋值的时候再去拿到别的值! 不然会产生赋值之后的这个成员变量到底是谁的别名! 通过在初始化列表进行初始化我们再去赋值我们就知道这个引用是谁的别名。
3.自定义类型成员的初始化:
我们通过初始化列表就可以自己搞定初始化一个队列!
3-1.自定义类型初始化列表:
通过初始化列表自己去调用对应的构造函数去完成我们想要多大的栈就可以初始化多大的栈!
3-2.所有都可以使用初始化列表?
我们不能完全舍弃构造函数初始化!因为对于构造函数来说处理栈空间开辟是否成功等比较长的代码上是比较有优势的。初始化列表没有办法去判断栈空间是否开辟成功!
4.初始化列表的顺序!
初始化列表要和类的成员变量定义顺序相同!
4.总结:
1.引用,const,没有默认构造的自定义类型成员!
2.自定义类型的成员有显示的构造函数!
文章来源:https://www.toymoban.com/news/detail-739062.html
3.尽量使用初始化列表因为不使用也会走到初始化列表中!
3-1:
80%----100% 使用初始化列表:
0%-20% 进行初始化列表+构造函数的混和使用!文章来源地址https://www.toymoban.com/news/detail-739062.html
到了这里,关于[C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!