1.运算符重载问题
运算符重载就是对这个运算符赋予了新的意义,我们的运算符在没有被重载前,只能用于许多自定义类型,但是经过重载后,我们可以用于自定义类型。
首先还是要说明有几个运算符是不能重载的,如.* :: sizeof ? : .这五种运算符不能重载
下面我们来演示几种经典的运算符重载
如果我想比较d1和d2的大小,在没有重载之前我们是无法进行比较的,因此我们就可以重载一个>符号
对了,还要跟大家说清楚,就是你在重载的时候所有参数的类类型应该都是相同的,就是你不能用两个不同定义的对象去进行运算符重载
我们在设置运算符重载时,我们应该根据实际情况来确定返回值,比如我们在平时可能喜欢写这样的代码
连等式,因为首先是d3赋值给d2,然后再是d2赋值给d1
这是我还没写返回值的样子,我们看,调用这个运算符重载我们需要两个Data类型的对象,那么我们就必须要返回一个Data类型的对象,为了减少拷贝构造,我们可以返回引用
接下来我们来讲一讲<<和>>的重载
首先我们要了解清楚的是我们原来学过的cout和cin分别代表输出和输入,cout是ostream类里面的,而cin是istream类里面的
因为我们的目的是要打印日期中的年月日,所以我就放到类里面进行运算符重载,但是我们发现只能这样
平时我们都是写cout<<d1,但是如果我们把它放到类里面些就只能反过来,为了解决这一问题,我们就不得不运算符重载放到类外面来定义,成为全局函数,但是又面临一个难题,_day是private的,我们在类外面无法直接访问,这时就需要用到我们的友元函数,就是在某个类里声明某个函数是它的朋友,可以访问它的private成员(自己的理解)
至于为什么返回ostream的的引用,跟连等一样,我们经常些cout<<d1<<endl;这样的代码,所以在输出完d1后,我们还需要输出一个换行符,这时候就需要返回一个ostream类型的来继续调用运算符重载。
2.关于构造函数进一步
类里面包含以下成员时,必须要在初始化列表初始化里面初始化
1.引用 2.const对象 3.没有默认构造函数的自定义类型
还有一点就是初始化列表初始化的顺序不是按你写的初始化列表顺序来的,而是按照成员变量谁先声明就先初始化谁,比如说
上面初始化的顺序就是先_year然后_month再_day,那有人会说这个有什么作用,我们再来看一组代码
大家觉得这段代码会输出什么,答案如下图,这就与我们刚刚说的初始化的顺序有关系