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

本文详细介绍了C++中如何通过全局函数重载左移运算符`<<`,以实现自定义数据类型的输出。通过友元函数,可以访问类的私有属性并进行打印。同时,讲解了重载`<<`运算符时的注意事项,如必须传入`cout`的引用并返回引用以实现链式输出。示例代码展示了如何为`Person`类重载`<<`运算符,并在`test01`函数中演示了其使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

左移运算符重载


视频链接



作用:可以输出自定义数据类型

我们正常情况下无法输出自定义数据类型。这个时候就需要重载<<运算符
在这里插入图片描述





注意,通常不会用成员函数重载<<运算符,因为无法实现cout在左侧

成员函数只有一个参数


1.通常不会用成员函数重载左移运算符,首先如果这么写:void operator<<(Perosn &p),这是错误的,cout哪去了呢。


2.而void operator<<(cout),调用时(本质:p.operator<<(cout))会变成p<<cout,cout在右边,实际应该是cout<<P,cout在左边。



只能通过全局函数重载左移运算符


如何查找cout属于什么数据类型?点击cout,右键,选择转到定义

在这里插入图片描述



可以看到cout属于ostream类,也就是输出流对象
在这里插入图片描述



// 本质 operator<<(cout,p),简化cout<<p;
// cout传入的必须是引用,不能是值。因为全局只有一个cout,不能创造出一个新的cout出来。
// 如果函数返回的是void,我们只能使用一次cout<<。
// 如果返回的是cout,那么我们每执行一次cout<<,就返回cout,这样就可以无限追加内容了。
//上面的规则称为链式规则。
// 传入的是osream &cout,返回的也应该是引用
ostream &operator<<(ostream &cout,Person &p) {

	cout << "p.m_A=" << p.m_A << "   " << "p.m_B=" << p.m_B;
	return cout;
}


// 也可写成下面这样,把cout改成其他名字。但是调用的时候还是cout<<p
// 因为引用就是起别名
/*
ostream& operator<<(ostream &b,Person &p) {

	b << "p.m_A=" << p.m_A << "   " << "p.m_B=" << p.m_B;
	return b;
}
*/






重载运算符还可以和友元相结合

#include<iostream>
using namespace std;
#include<string>
// 左移运算符重载
// 作用:可以输出自定义数据类型
class Person {
// 友元,目的是让重载<<运算符的函数也可打印Person中的私有属性
	friend ostream& operator<<(ostream& cout, Person& p);
	friend void test01();
private:
	int m_A;
	int m_B;
	// 通常不会用成员函数重载左移运算符,因为不需要p.operator<<(p);这是错误的
	// 而void operator<<(cout),会变成p<<cout,cout在右边,实际应该是cout<<P,在左边

};
// 本质 operator<<(cout,p),简化cout<<p;
//链式规则,返回cout,可以无限追加
// 如何知道cout属于什么数据类型呢?点击cout,右键:转到定义(或者按F12)
ostream& operator<<(ostream &cout,Person &p) {

	cout << "p.m_A=" << p.m_A << "   " << "p.m_B=" << p.m_B;
	return cout;
}

void test01() {
	Person p; 
	p.m_A = 10;
	p.m_B = 10;
	cout << "这是普通输出:" << endl;
	cout << "p.m_A=" << p.m_A << "    " << "p.m_B=" << p.m_B << endl<<endl;
	//链式规则,返回cout,可以无限追加
	cout << endl << "链式规则:" << endl;
	cout << p <<endl<<"hello,world"<<endl;


}
int main() {
	test01();
	system("pause");
	return 0;
}


在这里插入图片描述

总结:1.重载左移运算符配合友元可以实现输出自定义数据类型
2.只能通过全局函数重载左移运算符
3.cout属于ostream类,并且重载函数必须传入的是cout的引用,返回的也必须是引用。→
ostream &(ostream &cout,Person p)。这样可以实现输出时无限追加内容。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值