1.日期类再续前缘 --- 流插入、流提取
a. 自定义类型不支持对象直接用运算符,想支持怎么办?
运算符重载:operate<<(ostream& out)
b. 为什么能自动识别类型?
本质就是函数重载(参数匹配)
c. cout << di 不能运行,d1<< cout能运行 ?
怎么解决?
(1)双操作数的运算符,第一个参数是左操作数,第二个参数是右操作数
(2)this是个隐藏的默认参数,把第一个参数占用了(Dte对象默认占据第一个位置,<<实现成成员函数那就是不好的
注意:
1.第一个参数不能加const,第二个可以加
2.暂且换成公有,cout传递给out,d1传递给d
3.如果设为私有怎么解决?
(1)get和set
(2)友元函数(我是你的朋友,我也可以访问你的私有)
有没有其他的问题?
返回值应该是cout再继续去做后一次流插入的左操作
所以返回值类型改成ostream&。
流插入和流提取相似
分析:
流本质是为了解决,自定义类型的输入和输出问题。
printf scanf无法解决自定义类型的输入输出问题,
C++用面向对象和运算符重载解决的,可以混着用
总结:
其他的运算符一般是实现成成员函数,>> <<流运算符必须是实现到大局,这样才能让流对象做第一个参数,才符合可读性。
2.运算符重载(补充)
不能去创建一些C语言里没有的
3.const成员
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
函数后加const。
先给个结论
1.权限能平移
2.const对象和非const对象都能调用const成员函数
3.比较大小不修改成员,分开的话(声明和定义都要加上const)
成员函数定义原则:
1.能定义成const成员函数都应该定义成const,这样const对象和非const对象都可以调用
2.要修改成员变量的成员函数,不能定义成const, const对象不能调用(很合理)非const才能调用
4.取地址及const取地址操作符重载
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
class Date { public: Date* operator&() { return this; } const Date* operator&()const { return this; } private: int _year; // 年 int _month; // 月 int _day; // 日 };
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
总结:
1.编译器原则找最匹配的。
2.如果没有牛肉面就去吃泡面
3.默认成员函数不写也能跑,写了不会生成
4.一般的类不考虑这个重载
5.为了逻辑自洽
5.初始化列表的初步理解
1. 剩下的3个成员没有在初始化列表显示写出来定义
2.但是他也会定义,只是内置类型默认给的随机值
3.如果是自定义类型成员会去调用它的默认构造函数
解决方案:
给默认构造
初始化列表,有缺省值用缺省值,没有就用随机值。缺省值给初始化列表没写的时候用的,