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

所谓左移运算符就是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;
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值