• 流插入操作符 (<<) 重载 —— 实现自定义类型数据的打印


            目录

    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. }

  • 相关阅读:
    将信息传播至每个角落,政府信息发布系统解决方案
    案例研究丨神策数据在多项目、多网络场景下使用JumpServer堡垒机
    JVM入门
    c++入门必学算法 并查集
    【Rust日报】2022-12-05 探索 docker 的 WASM 技术预览
    ubuntu18.04 编译edk2项目下的intel架构bios
    Python BeautifulSoup 库使用教程
    Linux(Centos7版本)安装Git
    使用 OpenCV 收集数据
    【计算机英语】学习从现在开始,行动起来
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/127694872