12.5.2 左移运算符重载
我们在输出一些内容时,用到的都是cout<<“asd”<<endl;这样的代码,这里的<<是左移运算符,也是一种特殊的函数:
- 函数名称:<<
- 形参:cout,[要输出的内容]
- 返回值:cout
但是左移运算符只能输出int、string等数据类型,如果我们有一个person类的对象p,怎么实现cout<<p<<endl;这样的功能呢?
首先我们定义一个Person类:
class Person
{
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
string m_Name;
int m_Age;
};
我们来尝试输出p,程序肯定报错:
因为系统不知道改怎么输出这个Person类。
然后我们来重载左移运算符:
首先调用左移运算符的函数原型是这样的:
operator<<(cout, p);
//也就是这样:
cout << p; //并且可以连续输出
那么根据上节介绍的知识,重载左移运算符时,函数形参是cout和p,返回值是cout。
我们转到cout的底层定义,发现cout是ostream类型的数据:
这样就可以仿照加号运算符重载的方式来重载左移运算符了:
ostream& operator<<(ostream& cout1, const Person &p)
{
cout << p.m_Name << '\t' << p.m_Age;
return cout1;
}
这里为了看得清晰,我把形参命名为cout1,其实直接命名为cout也行。
重载之后,main函数不再报错,且正常运行: