05-2-2 运算符重载-输入输出-右移运算符
右移运算符重载的作用:让结构体或者类可以直接完成左移运算符,无需将数据单独从结构体或者类拿出来。常见的需要用到右移运算符(>>
)的场景是:使用cin
输入。
完成左移运算符重载有、且只有一种方法:
- 在全局函数里面实现重载。
使用重载的时候,需要使用关键字operator
。右移运算符重载的函数声明是(准确说是以cin
为例):ostream& operator>>(istream& cin, 结构体/类名称 变量);
。
-
为什么我们需要右移运算符重载:
因为我们在使用类的时候,类如下:
class test { public: int m_A; int m_B; };
这时候实例化出一个对象,
t1
。我想要给t1
里面的成员属性的数据,需要访问t1
才可以获取。比如说:cin >> t1.m_A >> t1.m_B;
如果直接输入
t1
比如下面这样是会报错的。cin >> t1;
但是,我们可以使用右移运算符的重载来实现直接输出自定义的数据。
-
为什么是重载右移运算符(
>>
)而不是其他的比如cin
。-
因为如果我们在不进行重载右移运算符的使用输入如下的代码:
cin >> t1;
会报错,但是报错的不是
cin
,而是t1
前面的>>
:没有与这些操作数匹配的 ">>" 运算符
所以我们需要重载的是右移运算符(
>>
)而不是其他的东西。 -
cin
不是运算符。我们在写 c++代码的时候,需要包含头文件:
#include <iostream>
。如果涉及到输入输出的,需要使用using namespace std;
。这里面定义了cin
的作用。cin
是标准输入流下面的功能,而不是一个运算符。
-
如何进行右移运算符重载:
-
在全局函数里面实现重载。
不同于四则运算的运算符重载,右移运算符重载只可以使用全局函数。
如果在成员函数里面重载,本质上是一个类的对象调用一个函数。具体可以参考上一篇笔记([05-2-1 运算符重载-输入输出-左移运算符](./05-2-1 运算符重载-输入输出-左移运算符.md))
cin
是一个ostream
(标准输入流)的函数,全局只可以有一个,所以传入的时候需要引用的方式传入。返回值也是一个
cin
,也还是全局只可以有一个,所以也需要引用的方式返回。事实上,在this
指针中我们讲过一个链式编程思想。在上一节也复习过了。([03-2 this指针](./03-2 this指针.md))所以我们返回的时候,也必须要引用的方式返回,才可以让这个链一直链接下去。
istream& operator>>(istream& cin, class test& p) { cin >> p.m_A >> p.m_B; return cin; }
我们整体看一眼:
#include
using namespace std; istream& operator>>(istream& cin, class test& p); class test { public: int m_A; int m_B; }; int main() { class test t1; cin >> t1; return 0; } istream& operator>>(istream& cin, class test& p) { cin >> p.m_A >> p.m_B; return cin; } -
如何访问私有数据
如果权限不是
public
,可以使用友元或者提供公共权限public
下的接口用于访问数据。可以参考([05-2-1 运算符重载-输入输出-左移运算符](./05-2-1 运算符重载-输入输出-左移运算符.md))。
- 注意:
- 完成右移运算符重载只有一种方法:在全局函数里面实现重载。其函数声明是(以
cin
为例):istream& operator>>(istream& cin, 结构体/类名称 变量);
。 cin
是一个标准输入流(istream
)的函数,有,且只有一个,所以必须使用引用的方式传入函数。
- 完成右移运算符重载只有一种方法:在全局函数里面实现重载。其函数声明是(以
- 提示:
- 为了实现链式编程,返回值也是引用方式返回的
cin
。 - 如果类里面的数据是私有(
private
),可以使用友元(friend
)将右移运算符重载的函数设置为友元,这样可以直接访问。当然,也可以提供公共权限(public
)下的接口。 - 在开发中,如果在写函数的时候,不知道要返回什么的话可以先使用
void
声明返回值,后续发现要返回的时候再修改也不迟。
- 为了实现链式编程,返回值也是引用方式返回的
:-)