目录
在日期类里面,我们发现每次打印都需要使用 Print() 函数,能不能使用像内置类型一样使用"<<"符号呢?但是当我们使用时,会发现编译器不能通过,但是内置类型可以通过,还可以自动识别数据的类型。
?为什么内置类型可以直接使用,自定义类型不行呢?
?【答案】C++的流插入运算符“<>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象。在类库提供的头文件中已经对“<>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据。因此,凡是用“cout<>”对标准类型数据进行输入输出的,都要用#include 把头文件包含到本程序文件中。赋值是“天选之子”,会自动生成。
用户自己定义的类型的数据,是不能直接用“<>”来输出和输入的。如果想用它们输出和输入自己声明的类型的数据,必须对它们重载。
??为什么内置类型可以自动识别类型呢?
?【答案】面对不同类型的数据调用不同的函数,ostream对内置类型默认都进行了支持。即库里面已经写好了,通过函数重载识别不同类型。
?自定义类型的重载有两个方法:
但ostream是库的,不能随便修改。那我们就选择第二种方法。
① 把operator<<作为成员函数,按照内置类型的引用方式使用,报错。
②运算符重载时,第一个参数是做操作数,第二个参数是右操作数。?this指针会占用第一个参数。调用时与使用习惯(cout作为左参数,对象作为右参数)不符。
③ 将operator作为全局函数,把cout作为第一个参数,日期类作为第二个参数。
但又面临一个新的问题,无法访问私有。
有两种解决方法:
a、将私有改为公有.(不推荐)
b、使用友元函数。
④流提取跟流插入的重载是类似的
成员函数如果在类中定义,编译器可能会将其当成内联函数处理?。即声明和定义都放在类中。
在类外可以用inline声明:
内联没有地址,也不会进符号表。内联函数不能声明和定义分离,在引用函数时,直接 call 函数的地址使用,不需要链接;当声明和定义分离时,call 函数,但是只有定义,然后再符号表里面链接上定义使用。
因此,短小函数适合做内联的函数,可以直接是在类里面定义。