插入运算符“>>“和提取运算符“<<“的重载

这篇具有很好参考价值的文章主要介绍了插入运算符“>>“和提取运算符“<<“的重载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰插入运算符">>"和提取运算符"<<"的重载

🌸(1)要对"<<"和">>"运算符进行重载,必须重载为类的友元函数

🌸(2)重载的友元函数的返回类型应该是ostream对象或者istream对象的引用,即ostream&或istream&

🌸利用"<<",">>"以及"+","-"的重载实现,时差的计算


🐰插入运算符">>"和提取运算符"<<"的重载

在类库提供的头文件中已经对">>"和"<<"进行了重载,使之作为插入运算符和提取运算符,能用来输出和输入C++标准类型的数据自己定义的类型的数据,是不能直接用"<<"和">>"来输出和输入的。如果想用他们来输入和输出自己定义的类型的数据,就必须对他们进行重载

实际上,运算符"<<"和">>"已经被重载过很多次了。最初"<<"和">>"运算符是C语言中的位操作符。ostream类对"<<"运算符进行了重载,将其转换为一个输出工具。cout就是ostream的对象,它是智能的,能识别所有的C++基本类型这是因为对于每种类型,ostream类声明中都包含了相应的重载函数"operator<<"的定义。因此要使cout能够识别自己定义类的对象,就要在自己的类中对"<<"运算符进行重载。

注意:在系统已经定义了ostream类的对象cout,所以我们直接使用cout就行

重载时需注意的地方

🌸(1)要对"<<"和">>"运算符进行重载,必须重载为类的友元函数

为什么一定要重载为的友元函数?

例如:

#include<iostream>
using namespace std;
class A
{
public:
    A(int b=0):a(b)
    {
        ;
    }
    int a;
    ostream& operator<<(ostream& out)
    {
        out<<a;
        return out;
    }
    friend ostream& operator<<(ostream& out,A& ptr);
};
ostream& operator<<(ostream& out,A& ptr)
{
    out<<ptr.a;
    return out;
}
void test1()
{
    A a(520);
    a.operator<<(cout)<<endl;
    a<<cout<<"大河之水天上来"<<endl;
}
void test2()
{
    A a(1314);
    operator<<(cout,a)<<endl;
    cout<<a<<"奔流到海不复回"<<endl;
}
int main()
{
    //如果使用成员函数来重载,使用起来就非常的迷惑,必须把自己定义的类对象写前面, a<<cout,这种形式就很奇怪
    test1();
    //使用友元函数来重载,代码的可读性增强,cout<<a
    test2();
    return 0;
}
结果:
520
520大河之水天上来
1314
1314奔流到海不复回

注意:新的"operator<<"定义使用的orstream类引用out作为它的第一个参数通常情况下,out引用cout,如表达式"cout<<t"所示。但也可以将这个运算符用于其他的orstream对象。

调用"cout<<t"应用的对象本身,这样,表达式"cout<<a"将导致out是cout1的别名。A对象可以按值或引用来传递,因为这两种形式都使函数能够使用对象的值。引用更节省空间和时间

🌸(2)重载的友元函数的返回类型应该是ostream对象或者istream对象的引用,即ostream&或istream&

注意:对于">>"运算符重载函数的原理相同

🌸利用"<<",">>"以及"+","-"的重载实现,时差的计算

#include<iostream>
using namespace std;
class Timer
{
public:
  Timer()
    {
      hours=0;
      minutes=0;
    }
    Timer(int h,int m):hours(h),minutes(m)
    {
        ;
    }
    friend Timer operator+(Timer& pf,Timer& pc);
    friend Timer operator-(Timer& pf,Timer& pc);
    friend ostream& operator<<(ostream& out,Timer& ptr);
    friend istream& operator>>(istream& in,Timer& ptr);
private:
    int hours;
    int minutes;
};
Timer operator+(Timer& pf,Timer& pc)
{
    Timer ptr;
    ptr.minutes=pf.minutes+pc.minutes;
    ptr.hours=pf.hours+pc.hours+ptr.minutes/60;
    ptr.minutes%=60;
    return ptr;
}
Timer operator-(Timer& pf,Timer& pc)
{
    Timer ptr;
    int x;
    x=pf.hours*60+pf.minutes-pc.hours*60-pc.minutes;
    ptr.hours=x/60;
    ptr.minutes=x%60;
    return ptr;
}
ostream& operator<<(ostream& out,Timer& ptr)
{
    out<<ptr.hours<<" hours"<<","<<ptr.minutes<<" minutes";
    return out;
}
istream& operator>>(istream& in,Timer& ptr)
{
    cout<<"Input hours and minutes:";
    in>>ptr.hours>>ptr.minutes;
    return in;
}
int main()
{
    Timer t1,t2,t3,t4;
    cin>>t1>>t2;
    cout<<"t1="<<t1<<endl;
    cout<<"t2="<<t2<<endl;
    t3=t1+t2;
    cout<<"t3=t1+t2="<<t3<<endl;
    t4=t1-t2;
    cout<<"t4=t1-t2="<<t4<<endl;
    return 0;

}
运行结果:
Input hours and minutes:23 13
Input hours and minutes:21 39
t1=23 hours,13 minutes
t2=21 hours,39 minutes
t3=t1+t2=44 hours,52 minutes
t4=t1-t2=1 hours,34 minutes


🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   文章来源地址https://www.toymoban.com/news/detail-467342.html

到了这里,关于插入运算符“>>“和提取运算符“<<“的重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++——类和对象3|日期类型|Cout运算符重载|Cin运算符重载|const成员|

    目录 日期类型  Date.h  Date.cpp  Test.cpp  实现Cout运算符重载  实现Cin运算符重载  根据日期算星期  修改后完整代码   Date.h  Date.cpp  const成员  取地址及const取地址操作符重载 习题  计算日期到天数转换     一个类到底可以重载哪些运算符,要看哪些运算符对这个类型有

    2023年04月13日
    浏览(58)
  • 【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )

    在之前的博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 , 实现了一个数组类 , 在一个类中 , 封装了一个 int 类型的指针 , 该指针指向堆内存的 内存空间 , 用于存放一个数组 ; 核心是 2

    2024年02月07日
    浏览(36)
  • C++修炼之筑基期第四层 ——透过日期类看运算符重载 | 赋值运算符重载 | 取地址操作符重载

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章主要

    2023年04月09日
    浏览(82)
  • 【C++】运算符重载

    目录 1. 基本概念 1.1 直接调用一个重载的运算符函数 1.2 某些运算符不应该被重载 1.3 使用与内置类型一致的含义 1.4 赋值和复合赋值运算符 1.5 选择作为成员或者非成员 2. 输入和输出运算符 2.1 输出运算符重载 2.2 输入运算符重载 3. 算术和关系运算符 3.1 算数运算符重载 3.2

    2024年02月11日
    浏览(48)
  • C++:重载运算符

    1.重载不能改变运算符运算的对象个数 2.重载不能改变运算符的优先级别 3.重载不能改变运算符的结合性 4.重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象,或类对象的引用 5.重载运算符的功能要类似于该运算符作用于标准类型数据

    2024年02月10日
    浏览(51)
  • C++——运算符重载

    运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载的目的是让语法更加简洁 运算符重载不能改变本来寓意,不能改变基础类型寓意 运算符重载的本质是另一种函数调用(是编译器去调用) 这个函数统一的名字叫opera

    2024年02月16日
    浏览(53)
  • 复习 --- C++运算符重载

    .5 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另外一种功能,以适应不同的数据类型 4.5.1 加号运算符重载 作用:实现两个自定义数据类型相加的运算 4.5.2 左移运算符重载 4.5.3递增运算符重载 作用:通过重载递增运算符,实现自己的整型数据 4.5.4 赋

    2024年02月07日
    浏览(49)
  • kotlin 运算符重载解析

    反编译之后的java代码为: 可以看到实际是生成了一个 plus方法, 然后我们把我们的plus1方法名称修改为plus ,编译报错,提示有2个同名方法。 完美 。

    2024年02月15日
    浏览(47)
  • 【C++初阶】五、类和对象(日期类的完善、流运算符重载函数、const成员、“&”取地址运算符重载)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】四、类和对象 (构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)-CSD

    2024年02月05日
    浏览(50)
  • C++ 面向对象(3)——重载运算符和重载函数

    C++ 允许在同一作用域中的某个 函数 和 运算符 指定多个定义,分别称为 函数重载 和 运算符重载 。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个 重载函数 或 重载运算符 时

    2024年02月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包