C++ 流插入和流提取运算符的重载

简介: C++ 流插入和流提取运算符的重载

1.<< 运算符的重载

C++ 在输出内容时,最常用的方式:


std::cout << 1 <<"hello";


提出问题:

  • 那这条语句为什么能成立呢?
  • cout 是什么?为什么 << 运算符能用在 cout 上呢?


原因:

  • 实际上,cout 是在 iostream 头文件中定义的 ostream 类的对象。
  • << 能够用在 cout 上是因为,在 ostream 类对 << 进行了重载。


对于如下这条语句


std::cout << 1 <<"hello";


有可能按以下的方式重载成 ostream 类的成员函数:


ostream & ostream::operator<<(int n)
{
    .... // 输出n整型的代码
    return *this;
}
ostream & ostream::operator<<(const char * s)
{
    .... // 输出s字符串的代码
    return *this;
}


那么在使用流插入<<运算符时,等价于的形式如下:


01 数据类型是int类型时:


std::cout << 1;


上面的语句,等价于:


    cout.operator<<(1);

    02 数据类型是字符串类型时:


    std::cout << "hello";


    上面的语句,等价于:


    cout.operator<<("hello");

    03 数据类型组合使用时:


    std::cout << 1 <<"hello";


    上面的语句,等价于:


    ( cout.operator<<(1) ).operator<<("hello");


    假定我们要想把某个对象里的内容进行打印输出,那么我们可以重载 ostream 类的流插入 << 运算符。


    下面以 CStudent 类作为例子:


    4.jpg


    输出结果:


    1,20,小林coding


    需要注意:


    ostream & operator<<(ostream & o, const CStudent & s)


    函数是全局的,所以函数的第一个参数必须要传入 ostream 的对象,并且 CStudent 类需要将此函数声明成友元函数,使得函数可以访问 CStudent 类的私有成员变量。


    2.>> 运算符的重载


    还是以 CStudent 类作为例子,假设想通过键盘的输入的内容,来初始化对象,则我们可以重载 istream 类的流提取 >> 运算符。


    5.jpg


    输入内容和输出内容:


    // 输入内容:
    1,20,小林coding
    // 输出内容:
    1,20,小林coding


    3.小结


    要想流插入 << 运算符和流提取 >> 运算符能针对自定义的对象,那么我们就需要重载针对该对象的 ostream 类的 << 运算符 和 istream>> 运算符,并且只能重载成全局的函数
    然后在 CStudent 类里需要把上面的两个重载函数声明成友元函数,使得两个重载的函数可以访问和赋值 CStudent 类里的私有成员函数。


    相关文章
    |
    6月前
    |
    编译器 C++
    C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
    C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
    53 1
    |
    3月前
    |
    C++
    【C++基础】运算符详解
    这篇文章详细解释了C++中运算符的用法,包括算术运算符、赋值运算符、比较运算符和逻辑运算符,以及它们在表达式中的作用和示例。
    44 2
    |
    3月前
    |
    C++
    C++(十九)new/delete 重载
    本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
    |
    4月前
    |
    C++
    c++学习笔记02 运算符
    C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
    42 6
    |
    5月前
    |
    NoSQL 编译器 Redis
    c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
    c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
    |
    5月前
    |
    存储 C++
    【C++】string类的使用③(非成员函数重载Non-member function overloads)
    这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
    |
    5月前
    |
    NoSQL Redis C++
    c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
    c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
    |
    6月前
    |
    C++
    C++之运算符
    C++之运算符
    |
    6月前
    |
    安全 程序员 C++
    C++一分钟之-重载运算符
    【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
    48 2
    |
    6月前
    |
    C++
    C++一分钟之-理解C++的运算符与表达式
    【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a &gt; b) ? &quot;greater&quot; : &quot;not greater&quot;`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
    42 3