c++,运算符重载(左移运算符<<)
引言
在c++中,提供了运算符重载的方式,来让程序的可用性更强
这里,介绍一下左移运算符"<<"
左移运算符的重载可以帮助我们更好的输出自定义的数据类型,可以做到简洁,在不浪费更多代码行的情况下,使用函数,来输出类中的成员属性数据
上代码
这里我们先创建一个类
将成员属性设定为私有,当然设置为公共类型也可以,设置私有类型是为了展示当类内成员是私有时,要使用友元左移运算符重载函数来完成对类内成员的输出
class person
{
public:
friend ostream& operator<<(ostream& cout, person& p);
person()//这里使用构造函数来完成对成员属性的赋值
{
this->m_A = 10;
this->m_B = 10;
}
private:
int m_A;
int m_B;
};
那么,既然要输出成员属性,为什么不把左移运算符重载函数写在类内做成员函数呢,主要是因为若把左移运算符写在类内就会出现异常情况
ostream &operator<<(cout)
在调用对象时就会出现这样的情况
例如创建一个对象p
person p;
那么就会出现
p<<cout;
出现cout在左移运算符的右边,就会出现编译错误,所以左移运算符的重载只能用全局函数来实现
ostream& operator<<(ostream& cout, person& p)
{
cout << "m_A=" << p.m_A << " m_B=" << p.m_B;//此处不能加endl
return cout;//只有返回一个cout,函数中才能使用endl进行链式编程
}
那么其中出现ostream是什么,ostream是cout的数据类型,属于标准输出流,如果要完成左移运算符的重载,必须设置返回值为标准输出流ostream
由于cout属于输出流ostream类型,所以返回值必须为ostream,加引用是为了确定全局只能有一个cout的对象
所以函数必须返回一个cout<<若不返回将无法进行cout<<的链式编程,以及endl换行
剩余代码
void test01()
{
person p;
cout << p << endl;
//此处cout<<p<<endl;是左移运算符的函数重载的简化
//其本质为
//cout<<p.operator(cout,p)
//使用左移运算符重载可以简化自定义输出时,浪费代码行的代价,做到一口气全部输出自定义数据类型
}
int main()
{
test01();
system("pause");
return 0;
}
最后实现效果
这是左移运算符重载的使用和主要事项