IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 链式编程返回值是引用而非对象的原因 -> 正文阅读

[C++知识库]链式编程返回值是引用而非对象的原因

链式编程思想

  • 函数返回的是this指针的解引用,也就是被调用函数的对象。

  • 例如c++的输出函数 cout,它可以无限追加,这就是链式编程思想

    cout << "hello" << "world" << "Tony" <<endl;
    

返回值为什么是引用

  • 采用链式编程思想的函数的返回值是引用,即对象本身,而非值拷贝

  • 示例-返回值为引用

      #include <iostream>
      #include <vector>
      #include <string>
      #include <algorithm>
      
      using namespace std;
      
      class Person
      {
      public:
          Person(int age):m_age(age) {}
          Person& PersonAddAge(Person &p)
          {
              this->age += p.age;
      
              //this指向p2的指针,而*this指向的是p2这个对象的本体
              return *this;
          }
      
          int m_age;
      };
      
      void test()
      {
          Person p1(10);
          cout << "p1的年龄为:"<<p1.age << endl;
      
          Person p2(10);
      
          //链式编程思想
          p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
          cout << "p2的年龄为:"<<p2.age << endl;
      }
      
      int main()
      {
          test();
          
          cout << "program run finish!" << endl;
          return 0;
      }
    

    运行结果:

    p1的年龄为:10
    p2的年龄为:40
    program run finish!
    
  • 示例-返回值为对象

      #include <iostream>
      #include <vector>
      #include <string>
      #include <algorithm>
      
      using namespace std;
      
      class Person
      {
      public:
          Person(int age):m_age(age) {}
          Person PersonAddAge(Person &p)
          {
              this->age += p.age;
      
              //this指向p2的指针,而*this指向的是p2这个对象的本体
              return *this;
          }
      
          int m_age;
      };
      
      void test()
      {
          Person p1(10);
          cout << "p1的年龄为:"<<p1.age << endl;
      
          Person p2(10);
      
          //链式编程思想
          p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
          cout << "p2的年龄为:"<<p2.age << endl;
      }
      
      int main()
      {
          test();
          
          cout << "program run finish!" << endl;
          return 0;
      }
    

    运行结果:

     p1的年龄为:10
     p2的年龄为:20
     program run finish!
    

原因分析

  • 返回值为对象引用

    返回的是对象本身,在对象本身上连续增加3次年龄,所以是40.

  • 返回值为对象

    此函数 return *this 返回时,由于此函数返回值类型是对象,所以此处会创建一个临时对象,相当于:

    Person temp;
    temp = *this;
    

    p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1) 操作中

    • 只有第一个PersonAddAge(p1)对p2的年龄进行了加10操作,为20岁,且创建临时变量temp,进行值拷贝,此时temp的年龄也为20岁

    • 第二个PersonAddAge(p1)是给临时变量temp增加十岁,此时temp的年龄为30岁,同时第三个temp1,进行值拷贝,此时temp1的年龄同temp一样,也为30岁

    • 第三个PersonAddAge(p1)是给临时变量temp1增加十岁,此时temp1的年龄为40岁,同时第三个temp2,进行值拷贝,此时temp2的年龄同temp1一样,也为40岁

    • 最终p2的年龄只在第一次PersonAddAge(p1)时增加了一岁而已,为20岁。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:11:57  更:2022-04-24 09:12:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:07:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码