左移运算符
形如"<<"
定义
在C++中左移运算符就是标准的一个输出流类创建的一个输出流对象,通俗点是"cout<<"后的合法内容会被输出到终端并显示。
目的
解决直接输出类成员属性的问题:通过重载左移运算符一次性输出成员的属性。
详解重载过程
函数名用编译器提供的operator<<
具体形式
学生类示例:
class Student { friend ostream &operator<<(ostream& out, Student& s); public: Student(int h, int w) { this->s_hight = h; this->s_weight = w; } private: int s_hight; int s_weight; };
这个学生类有两个私有属性身高和体重以及一个有参构造方法来给私有属性赋值,然后开头是一个友元的声明,目的是让重载的运算符可以访问身高和体重这两个私有属性,不理解friend关键字的朋友们可以看看我端午节发的关于C++的友元知识🎉友元的所有形式🎉
类比上次的加号运算符重载,左移运算符重载应该可以有两种方式,即成员函数实现和全局函数实现,但是成员函数是不常用的,看接下来的解释。
不建议成员函数实现
ostream& operator<<(ostream& cout) { cout << "该学生身高为:"<< this->s_hight; cout << "该学生体重为:"<< this->s_weight; return cout; }
调用形式:
void test1() { Student S1(180, 130); S1 << cout<<"\nHello World"; }
这个是可以运行的,但是看着太别扭了,由于是成员函数,需要用对象调用该函数,那么对象就得写前面,要是自己看还好,要是给别人看还不得被笑死 ,所以我很不推荐用成员函数实现左移的重载,至于重载的函数为什么这样写,在我下面展示完全局函数实现重载的时候会一一详解,往下看。
全局函数实现
ostream &operator<<(ostream &out, Student& s) { out << "该学生身高为:" << s.s_hight << "\t该学生体重为:" << s.s_weight ; return out; }
调用形式:
void test() { Student S(182, 140); cout << S << "\t还没结束" << endl; }
重载的函数名是operator<<,传入的参数是ostream &cout 和Student &s,返回值类型也是ostream &cout ,其实ostream 是cout的类型,而cout又代表着标准输出流,我们可以这样看:在编译器找到cout,右键后选择速览定义,效果如下:
可以看到cout的定义是ostream类 ,cout是标准输出类的对象,这是静态地址,所以我们传参的时候要传入引用,以免产生副本;而且返回的时候也要返回该对象的引用形式,不然返回的地址不一样,而对象值作为返回值会调用拷贝构造函数在新的地址生成新的cout,这是肯定行不通的。因此返回值和参数都采用标准输出类的对象引用,而且这样符合链式编程的特点。可以不断增加"<<"来增加输出的内容。
运行效果: