所谓左移运算符就是cout<<
这个的箭头似的运算符
重载它所实现的功能为
就是你类里面有两个变量,然后你想通过输出一个对象,就能一下子将这两个变量都输出出去
运算符重载所注意事项
1.方式:成员函数重载
全局函数重载
2.关键字 operator
这个有点像照猫画虎一样
区别就在于
如果这样写
void operator<<(cout)//其结果p.operator<<(cout)简化版本就是p<<cout
和咱们要的结果cout<<p;
方向不一样
所以 不会利用成员函数重载<<运算符,因为无法实现cout<<
所以只能用全局函数重载<<运算符
这里我再解释一下,为什么用不了成员函数,就是咱们在调用这个函数的时候必须是
对象名.operator<<(cout)
这就相当于你要输出的东西跑<<左边去了,那你用的时候这就有点另类,不是常用的cout<<p;
你的目的是实现cout<<p;所以,成员函数达不到这个目的
下面我们先来研究一下cout的数据类型
可以这样查看
也可以直接把鼠标放在cout上面然后发现它出来
可以看到它属于输出流对象 ostream(输出类)
#include<iostream>
#include<string>
using namespace std;
//通过全局函数重载
class Person {
friend void operator<<(ostream &cout, Person &p);//变成友元函数来访问类中的私有成员
friend void test01();
public:
Person() {
};
Person(int a, int b) {
this->m_A = a;
this->m_B = b;
}
private:int m_A;
int m_B;
};
void operator<<(ostream &cout, Person &p) {
cout << p.m_A << " " << p.m_B << endl;
}
void test01() {
Person p1(10,20);
Person p2(10,20);
cout<< p1;
}
int main() {
test01();
return 0;
}
拓展:链式编程
上述cout<<p;后面是不可以再继续输出东西的
比如cout<<p<<endl;
这样就不可以,因为,你所定义的全局函数的返回值是void
如果改成ostream 就可以
#include<iostream>
#include<string>
using namespace std;
//通过全局函数重载
class Person {
friend ostream & operator<<(ostream &cout, Person &p);//变成友元函数来访问类中的私有成员
friend void test01();
public:
Person() {
};
Person(int a, int b) {
this->m_A = a;
this->m_B = b;
}
private:int m_A;
int m_B;
};
ostream & operator<<(ostream &cout, Person &p) {
cout << p.m_A << " " << p.m_B << endl;
return cout;
}
void test01() {
Person p1(10,20);
Person p2(10,20);
cout << p1 << endl << p2 << endl;
}
int main() {
test01();
return 0;
}
总结 重载左移运算符配合友元可以实现输出自定义数据类型