最近学习C++学到了运算符重载的部分,大部分运算符重载都就可以实现作为类中成员函数和全局函数进行重载实现,而左移运算符“<<”却只支持全局函数进行重载。这是是为什么呢?我来谈谈我的理解。
大家首先随便用cout输出一下,然后点击cout然后右键选择转到声明:
我们会看到如下图显示的,它的大概意思就是cout其实是编译器为我们创建了一个ostream类的一个对象。值得注意的是,整个编译器中,有且仅有这一个输出流ostream类的对象!(其实也可以自己创建,只不过要实现默认cout的作用要设置很多东西,并不是简单的ostream p;就可以创建出和cout等效的对象)
接下来我们来理解以下cout使用的方法
int a = 1025;
cout << a;
这句的意思是打印1025的数值,其中cout << a;可以这样理解,cout是一个数据流类,<< 是operator<<()的函数简写,a则是传入参数,所以可以理解这一步的意思是cout.operator<<(int a),然后编译器就理解这就是打印一个int数据类型的操作。但是值得注意的是我们常规使用的时候,打印是可以连续打印的。例如我们打印的cout << a << endl。我们知道调用函数是由返回值类型的,如果返回为void,显然后续void.operator<<(char '\n')是不存在的,也就是不合法的操作。如何才能正确进行操作呢,大家是不是已经想到了,返回值改成一个ostream类的一个对象就可以链接起来了!同时值得注意的是因为编译器就只有一个输出流ostream类的对象即cout所以我们要引用的形式进行接收。故此我们可以确定operator<<()的声明为ostream& operator<<(ostream&,---);---可为int,double,等等数据类型。说到这里我就为大家放上一份代码。
#include<iostream>
using namespace std;
class AA
{
public:
int m_a;
int m_b;
public:
};
ostream & operator<<(ostream &hh , AA& p)//ostream是个类,且对象只有一个,所以必须加&
{
hh << "m_a = " << p.m_a << " m_b" << p.m_b;
return hh;
}
void test02()
{
AA p;
p.m_a = 10;
p.m_b = 10;
cout << p.m_a << endl;
cout << p << endl; //operator<<(cout , p)
}
int main()
{
test02();
system("pause");
return 0;
}
这份代码的实现是依靠全局函数重载左移运算符的。那么为什么不用成员函数实现呢?
大家来看,cout << p如果定义的全局函数是不是可以理解为operator<<(ostream &cout , AA& p)
。如果我定义为成员函数operator<<(ostream &cout,AA& p ),我想和全局函数实现cout << p相同的内容,是不是需要用p1 cout << p;这种形式来写?我必须得先告诉这是那个对象的成员函数才能调用对不对?这种写法显然不存在!故此左移运算符"<<"不支持作为成员函数进行重载。
标签:cout,int,左移,C++,运算符,ostream,重载,函数 From: https://blog.csdn.net/weixin_55017074/article/details/143226653