左移运算符重载如下:
奏效!
把重载函数中的cout换成引用进来的参数out: 一样奏效!
这里为啥用cout和out效果相同?
因为out是ostream类的对象,而且这个类采用了单例模式,所以cout和out其实是同一个对象,所以效果相同。
为啥重载函数的ostream的参数必须是引用?
因为不引用的话,相当于传值,也就是要拷贝一份cout对象,但是ostream里面的拷贝构造函数是private的,无法拷贝,而且构造函数是protected的,不能在类外构造另一个对象。(其实本质还是因为ostream采用了单例模式。)
如何实现连续地输出cout<<m<<endl;?
需要在运算符重载的时候返回cout的引用。
endl本质是啥?和’\n’有什么不同?
在c++的源码中,endl就是一个内联函数,完成换行\n和刷新缓冲区的功能,源码截图如下:
为什么endl作为一个内联函数可以被用在<<的右边?
源码如下: 依然是在ostream中写的成员函数实现<<运算符重载,这里面的*_Pfn是函数指针,当我们传递endl给<<的时候,endl作为函数名也表示函数地址,所以根据这里的重载运算符,可以实现cout<<endl; 调用endl这个内联函数。
总结
实际上cout作为ostream的对象完成c++中的输出功能,都是在ostream中进行运算符重载实现的。
|