码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 流插入操作符 (<<) 重载 —— 实现自定义类型数据的打印


            目录

    1、认识内置的 operator<< 函数的声明和调用过程

    (1) 认识operator<< 操作符函数的声明

    (2) operator<< 函数的调用过程

    2、重载自定义类型的 operator<< 函数

    (1) 声明operator << 函数

    (2) Person类添加友元函数

    (3) 定义 operator << 函数

    (4) 测试


    C++中一般使用 cout 来打印数据,但是可惜的是,cout 一般仅支持内置类型的打印,对于结构体/ 类 这种自定义类型的数据,cout 并不支持。

    由于 cout 打印的本质其实是调用了 operator <<() 函数,因此,我们可以通过重载 operator <<() 函数来实现自定义类型的打印。

    1、认识内置的 operator<< 函数的声明和调用过程

    (1) 认识operator<< 操作符函数的声明

    下面是 ostream类 中的operator<< 函数

    流插入操作符<< 一般有两个操作数,这个函数因为是在ostream类内部声明的,所以隐藏了一个 this 指针,实际上声明应该是像下面这样:

    ostream& operator<<(ostream& this, int val);

    实际在调用 cout << val 的时候,会被转换成 operator<< (cout , val) 的形式。

     

    (2) operator<< 函数的调用过程

    operator<< 函数的返回值是ostream 对象的引用,目的是为了支持连续调用流插入函数。

    1. cout << a << b << endl;
    2. // (cout << a) << b <
    3. // operator<<(cout, a) << b << endl;
    4. // cout << b << endl;

    operator<<(cout, a) 的返回值依然是 cout,只不过是已经将 变量 a 插入到标准输出流以后的 cout。此时的 cout 将作为下一个 << 操作符的 左操作数来使用。

    2、重载自定义类型的 operator<< 函数

    假设我们要实现重载 自定义类Person 的operator << 函数。类的声明如下:

    1. class Person {
    2. public:
    3. Person(char* name, int age):_name(name),_age(age)
    4. {
    5. }
    6. private:
    7. char* _name;
    8. int _age;
    9. };

    (1) 声明operator << 函数

    跟内置类型的一样,返回值是ostream& 类型,因为要支持连续流插入,值得注意的是,为了使用 ostream 类型,需要同时引入 iostream 头文件 以及 标准命名空间 std。

    1. #include
    2. using namespace std;
    3. ostream& operator<< (ostream& os, Person p);

    (2) Person类添加友元函数

    operator << 函数的声明和定义是放在类外的,如果放在类内部,会自动加上一个隐藏的 this 指针,就i像下面这样:

    ostream& operator<< (Person* this, ostream& os, Person p);

    而且要在Person 类的内部声明 operator<<函数为友元函数,因为类外无法访问 private 成员。

    1. class Person {
    2. friend ostream& operator<< (ostream& os, Person p);
    3. public:
    4. Person(char* name, int age):_name(name),_age(age)
    5. {
    6. }
    7. private:
    8. char* _name;
    9. int _age;
    10. };

    (3) 定义 operator << 函数

    准备工作已经完成,最后就是实现了,完整的实现过程如下:

    1. class Person {
    2. friend ostream& operator<< (ostream& os, Person p);
    3. public:
    4. Person(char* name, int age):_name(name),_age(age)
    5. {
    6. }
    7. private:
    8. char* _name;
    9. int _age;
    10. };
    11. ostream& operator<< (ostream& os, Person p)
    12. {
    13. os << p._name << p._age << endl; // 将成员输入到流中,至于是什么流,这里可以先把os当作标准输出流
    14. return os;
    15. }

    (4) 测试

    1. int main() {
    2. char arr[20] = { "张三" };
    3. Person p1(arr, 18);
    4. cout << p1 << endl;
    5. return 0;
    6. }

  • 相关阅读:
    聊聊机器如何“写“好广告文案?
    jsArray数组复制方法性能测试2207292307
    065:mapboxGL在一个图层中随机添加100个标记(marker)
    Android10之Video MediaCodec硬解码流程(二十七)
    FPGA学习笔记(九)SPI学习总结及stm32的HAL库下SPI配置
    (02)Cartographer源码无死角解析-(32) LocalTrajectoryBuilder2D::AddRangeData()→点云的体素滤波
    快充插线板怎么选?我的办公搭子是它!
    vue中基础组件间通信(父子,子父,跨两级通信)
    SAT DPLL CDCL
    深入了解Python变量:从基础到高级
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/127694872
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号