目录
1.复习一下
我们之前介绍了运算符的重载,上面的这两种方式可以构成函数的重载,我们进行函数的调用的时候,首先会调用不带const的情况,如果没有不带const的情况,带const的也是可以接受的,因为这里是进行了权限的缩小,这个是允许的。
2.关于const的那点事
(1)上面的只会读取数据,因为前面和后面都加上了const这两个const一个都不可以少,前面的const是用来修饰返回值的,表示的是返回值不可以被修改,后面的const是用来修饰参数的,表示参数不可修改;
(2)下面的可以进行读,可以进修改;因为他的前面和后面都没有const进行修饰,所以我们是可以进行修改的;
上面的这两个就是想要说明,面对不同的情况,我们可以调用不同的函数,如果只是进行的读取,我们可以调用上面的函数,这样的话我们是没有办法对数据进行修改的;如果想要对数据进行修改,我们就可以调用下面的函数,这样面对不同的情况,调用不同的函数,效率更高;
3.关于取地址相关的默认构造函数
实际上构造函数除了默认的构造,析构,拷贝构造函数,还有一类构造函数是和取地址相关的;
就是取地址的符号原本也是一个运算符,如果我们直接对一个对象进行使用,本来应该是进行运算符的重载的,但是实际上我们使用的时候却不会报错,这个就是因为我们的运算符有一个默认的函数,我们可以直接获取某个对象的地址,不需要进行运算符的重载;
4.流插入&&流提取的运算符重载
(1)流插入运算符和流提取运算符是C++里面引入的两个秘密武器,他解决了c语言里面的printf和scanf的局限性问题;
(2)如果我们想要打印cout<<d1这个对象,显然是无法实现的,但是我们可以对流插入和流提取这两个运算符进行重载;
(3)这里我们考虑的更加全面,我们这里的重载适合cout<<d1<<d2这样多次进行输出的情况,因此我们设置了返回值;
(4)这里的重载不能设置为成员函数,因为成员函数里面有默认的this指针,但是我们实际输出的时候cout<<d1,前面的是运算符,后面的是参数;
如果我们设置为成员函数就是operator<<(ostream& out),加上前面隐藏的this指针,this代表d1,out代表的就是cout这样的话顺序就搞反了,但是这个this指针的顺序我们是没有办法进行修改的,因此我们只能写成全局函数;写成全局函数之后我们就可以改变这个指针的位置(我们这里是使用const date& d进行代替的);
(5)流提取的道理是类似的,但是我们的参数不加const因为输入的时候是会修改的,但是输出的时候不会进行修改,因此我们重载cout的时候在参数的前面加上了const;
(6)这里再说一下为什么这里要有返回值,是因为我们这里是连续进行输入的,我们cout<<d1之后如果重载的返回值是void,这个连续的d2是没有办法进行打印输出的;我们设置返回值是out实际上就是让这个d2也可以打印出来;
(7)ostream是一种类型,我们的cout就属于这个类型,同理:istream也是一种类型,cin就属于这个类型;
(8)我们这里的<<实际上就是一个操作符,左右两边各有一个操作数,两个操作数所以我们设置了两个参数,第一个参数就是我们的实际的cout,第二个参数就是实际适应的时候打印的对象d1.