4.5.2 左移运算符重载
作用: 可以输出自定义数据类型
总结: 重载左移运算符配合友元可以实现输出自定义数据类型
使用左移运算符重载的原因:
可以输出自定义数据类型
重载一般分为成员函数重载和全局函数重载, 但此处一般不实用成员函数重载
class Person
{
public://利用成员函数重载 左移运算符 p.operator<<(cout) 简化版本 p << cout//不会利用成员函数重载<<运算符,因为无法实现 cout在左侧//void operator<<(Person& p)//{//}int m_A;int m_B;
};
故只能利用全局函数重载左移运算符
cout
的数据类型是ostream
(输出流, 可以右键cout
查看)
此处cout为引用, 相当于起别名, 可以随意命名
//只能利用全局函数重载左移运算符
ostream &operator<<(ostream &out, Person &p)//本质 operator<<(cout,p) 简化cout<<p
{out << "m_A = " << p.m_A << " m_B = " << p.m_B;return cout;
}
命名后即可正常使用(若返回类型为void
则无法链式编程, 所以要将返回类型写为ostream
):
void test01()
{Person p;p.m_A = 10;p.m_B = 10;cout << p <<"hello world" << endl;
}int main()
{test01();system("pause");return 0;
}
此时的完整示例代码:
#include<iostream>
using namespace std;//左移运算符重载
class Person
{
public://利用成员函数重载 左移运算符 p.operator<<(cout) 简化版本 p << cout//不会利用成员函数重载<<运算符,因为无法实现 cout在左侧//void operator<<(Person& p)//{//}int m_A;int m_B;
};//只能利用全局函数重载左移运算符
ostream &operator<<(ostream &out, Person &p)//本质 operator<<(cout,p) 简化cout<<p
{out << "m_A = " << p.m_A << " m_B = " << p.m_B;return cout;
}void test01()
{Person p;p.m_A = 10;p.m_B = 10;cout << p <<"hello world" << endl;
}int main()
{test01();system("pause");return 0;
}
但一般情况下类中成员变量应该为私有权限, 可以使用友元:
class Person
{friend ostream& operator<<(ostream& out, Person& p);
private:int m_A;int m_B;
};
替换Person类后发现仍然报错, 是因为原有的默认构造函数不可用, 所以我们应在public权限下补全默认构造函数:
class Person
{friend ostream& operator<<(ostream& out, Person& p);
public:Person(int a, int b){m_A = a;m_B = b;}
private:int m_A;int m_B;
};
在test01()
函数中补全赋初值的操作:
void test01()
{Person p(10, 10);//快速初始化, 与下两行效果相同//p.m_A = 10;//p.m_B = 10;cout << p <<"hello world" << endl;
}
程序即可正常运行。
完结撒花
完整示例代码
#include<iostream>
using namespace std;//左移运算符重载
class Person
{friend ostream& operator<<(ostream& out, Person& p);
public:Person(int a, int b){m_A = a;m_B = b;}
private:int m_A;int m_B;
};//只能利用全局函数重载左移运算符
ostream &operator<<(ostream &out, Person &p)//本质 operator<<(cout,p) 简化cout<<p
{out << "m_A = " << p.m_A << " m_B = " << p.m_B;return out;
}void test01()
{Person p(10, 10);//快速初始化, 与下两行效果相同//p.m_A = 10;//p.m_B = 10;cout << p <<"hello world" << endl;
}int main()
{test01();system("pause");return 0;
}