运算符重载-输入输出-右移运算符

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

    1. 因为如果我们在不进行重载右移运算符的使用输入如下的代码:

      cin >> t1;

      会报错,但是报错的不是cin,而是t1前面的>>

      没有与这些操作数匹配的 ">>" 运算符

      所以我们需要重载的是右移运算符(>>)而不是其他的东西。

    2. cin不是运算符。

      我们在写 c++代码的时候,需要包含头文件:#include <iostream>。如果涉及到输入输出的,需要使用using namespace std;。这里面定义了cin的作用。

      cin是标准输入流下面的功能,而不是一个运算符。

如何进行右移运算符重载:

  1. 在全局函数里面实现重载。

    不同于四则运算的运算符重载,右移运算符重载只可以使用全局函数。

    如果在成员函数里面重载,本质上是一个类的对象调用一个函数。具体可以参考上一篇笔记([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;
    }
  2. 如何访问私有数据

    如果权限不是public,可以使用友元或者提供公共权限public下的接口用于访问数据。可以参考([05-2-1 运算符重载-输入输出-左移运算符](./05-2-1 运算符重载-输入输出-左移运算符.md))。

  • 注意:
    1. 完成右移运算符重载只有一种方法:在全局函数里面实现重载。其函数声明是(以cin为例):istream& operator>>(istream& cin, 结构体/类名称 变量);
    2. cin是一个标准输入流(istream)的函数,有,且只有一个,所以必须使用引用的方式传入函数。
  • 提示:
    1. 为了实现链式编程,返回值也是引用方式返回的cin
    2. 如果类里面的数据是私有(private),可以使用友元(friend)将右移运算符重载的函数设置为友元,这样可以直接访问。当然,也可以提供公共权限(public)下的接口。
    3. 在开发中,如果在写函数的时候,不知道要返回什么的话可以先使用void声明返回值,后续发现要返回的时候再修改也不迟。
文章「运算符重载-输入输出-右移运算符」,由本站用户「Admin」发布。文章仅代表Admin观点,不代表本站立场。
页面网页地址「https://xiaozhiyuqwq.top/p/906」。
如您对文章及其附件提出版权主张,或进行引用转载等,请查看我们的【版权声明】
无评论:-)

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇