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;
}