当前位置: 首页 > news >正文

c++成员函数返回类对象引用和直接返回类对象的区别

c++成员函数返回类对象引用和直接返回类对象的区别

成员函数直接返回类对象(返回临时对象,对象拷贝)

#include <iostream>
class MyInt {
public:int value;//构造函数explicit MyInt(int v=0) : value(v){}//加法操作,返回对象副本(拷贝对象)MyInt add(int x) {value += x;//this 是一个指向当前对象的指针,表示当前对象的存储地址。//*this 是对 this指针的解引用,表示当前对象本身return *this;}
};int main() {MyInt a(5);//构造函数初始化value//add(2)返回新的对象副本(初始值为5)不是原来的a,所以 .add(3)是对临时对象的操作a.add(2).add(3);std::cout << a.value << std::endl;return 0;
}


对象成员变量被初始化为5
a.add(2).add(3) 的执行顺序是关键。以下是详细解释:
a.add(2) 的执行:
a.add(2) 调用 add 方法,将 a.value 的值从 5 增加到 7。
add 方法返回的是当前对象的副本(*this),返回类型 函数名称 MyInt add(),而不是对原对象 a 的引用。
.add(3) 的执行:
.add(3) 是对 a.add(2) 返回的临时对象的操作,而不是对原对象 a 的操作。
临时对象的 value 是 7,它被加上 3,但这个副本不会影响原对象 a。
std::cout << a.value:
输出的是原对象 a 的 value,此时 a.value 仍然是 7,因为 .add(3) 的操作只影响了临时对象

成员函数返回类对象引用(返回对象引用)

#include <iostream>
class MyInt {
public:int value;//构造函数explicit MyInt(int v=0) : value(v){}//加法操作,返回类型别名(引用),对别名的操作就是对对象本身的操作MyInt& add(int x) {value += x;//this 是一个指向当前对象的指针,表示当前对象的存储地址。//*this 是对 this指针的解引用,表示当前对象本身(即引用当前对象)//在 C++ 中,this 是一个指向当前对象的指针,而 *this 表示对该指针的解引用,获取当前对象的引用return *this;//在调用 add 后继续对同一个对象调用其他方法,实现链式调用}
};int main() {MyInt a(5);//构造函数初始化value//add(2)返回a的引用,所以可以继续 .add(3)a.add(2).add(3); //链式调用允许多个操作在一行代码中连续执行,而无需多次引用对象std::cout << a.value << std::endl;return 0;
}


在代码中,a.add(2).add(3); 的执行顺序是关键。
a.add(2):
调用 add 方法,value 的值从 5 增加 2,变为 7。
add 方法返回当前对象的引用(*this),对引用(别名)的操作就是对原对象的操作,因此可以继续调用链式方法。
.add(3):
在 a.add(2) 返回的对象上再次调用 add 方法。
此时,value 的值从 7 增加 3,变为 10。
最终,a.value 的值是 10,因此输出结果为 10。

相关文章:

  • java中的方法详解
  • Seata源码—5.全局事务的创建与返回处理二
  • Linux中的进程
  • Java-Collections类高效应用的全面指南
  • 如何安装双系统?即windows已经安装,如何安装ubuntu 22.04LTS
  • ​哈夫曼树(Huffman Tree)
  • 【Java ee初阶】HTTP(4)
  • 咖啡叶子病害检测数据集VOC+YOLO格式1468张4类别均为单叶子
  • 二进制与十进制互转的方法
  • Linux的静态库 共享库 进程 主函数的参数
  • Redis内存管理深度解析
  • Kotlin 作用域函数(let、run、with、apply、also)对比
  • 副业小程序YUERGS,从开发到变现
  • uniapp +vue +springboot多商家订餐系统
  • Harmony开发 List、Grid拖动自定义排序实现
  • Spring之Bean的初始化 Bean的生命周期 全站式解析
  • LeetCode Hot100刷题——轮转数组
  • 【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)
  • docker-compose——安装mongo
  • 搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫
  • 特朗普:将于19日分别与普京和泽连斯基通话
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦
  • 篮球培训机构东方启明星被指停摆,家长称已登记未退费用超百万
  • 韶关一企业将消防安装工程肢解发包,广东住建厅:罚款逾五万
  • 网易一季度净利增长三成,丁磊:高度重视海外游戏市场
  • “AD365特应性皮炎疾病教育项目”启动,助力提升认知与规范诊疗