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; }我们整体看一眼:
#includeusing 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声明返回值,后续发现要返回的时候再修改也不迟。
- 为了实现链式编程,返回值也是引用方式返回的