C++运算符重载左移运算符重载

所谓左移运算符就是cout<<这个的箭头似的运算符
重载它所实现的功能为
就是你类里面有两个变量,然后你想通过输出一个对象,就能一下子将这两个变量都输出出去
运算符重载所注意事项
1.方式:成员函数重载
全局函数重载
2.关键字 operator
这个有点像照猫画虎一样
区别就在于
如果这样写

void operator<<(cout)//其结果p.operator<<(cout)简化版本就是p<

和咱们要的结果cout<方向不一样
所以 不会利用成员函数重载<<运算符,因为无法实现cout<<
所以只能用全局函数重载<<运算符
这里我再解释一下,为什么用不了成员函数,就是咱们在调用这个函数的时候必须是
对象名.operator<<(cout)
这就相当于你要输出的东西跑<<左边去了,那你用的时候这就有点另类,不是常用的cout< 你的目的是实现cout<

下面我们先来研究一下cout的数据类型
可以这样查看
C++运算符重载左移运算符重载_第1张图片
也可以直接把鼠标放在cout上面然后发现它出来在这里插入图片描述
在这里插入图片描述
可以看到它属于输出流对象 ostream(输出类)

#include
#include
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< 比如cout< 这样就不可以,因为,你所定义的全局函数的返回值是void
如果改成ostream 就可以

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


在这里插入图片描述
总结 重载左移运算符配合友元可以实现输出自定义数据类型

你可能感兴趣的:(C++面向对象)