C++ 类成员函数 返回值类型 为 指针 引用 或 对象副本 的 区别

类的成员函数返回对象的指针:

return this;

返回值类型 : 类名*

支持链式调用:通过返回对象的指针,可以使得调用者能够连续调用该对象的其他成员函数,使用箭头操作符 (->)
条件性操作:可以根据条件返回对象自身的指针或nullptr,以表示某种状态或条件

#include <iostream>using namespace std;class MyClass
{
private:int num1;public:MyClass(){num1 = 0;}// 返回值类型为 MyClass*MyClass *change(){num1 += 1;// 表示指向MyClass类型对象的指针return this;}void show(){cout << num1 << endl;}
};
int main()
{MyClass mc1;// mc1的num1//  +1        +1        =2mc1.change()->change()->show();// mc1的num1//  +1        +1        =4mc1.change()->change()->show();// mc1的num1//  +1        +1        =6mc1.change()->change()->show();return 0;
}

类的成员函数返回对象的引用:

return *this

返回值类型: 类名&

支持链式调用:使得调用者可以连续调用该对象的其他成员函数,使用点操作符 (.)
修改原始对象:由于返回的是引用,对返回对象所做的任何修改都会反映在原始对象上,而不是其副本

#include <iostream>using namespace std;class MyClass
{
private:int num1;public:MyClass(){num1 = 0;}// 返回值类型为 MyClass&MyClass& change(){num1 += 1;// 表示当前对象return *this;}void show(){cout << num1 << endl;}
};
int main()
{MyClass mc1;// mc1的num1//  +1        +1        =2mc1.change().change().show();// mc1的num1//  +1        +1        =4mc1.change().change().show();// mc1的num1//  +1        +1        =6mc1.change().change().show();return 0;
}

类的成员函数返回对象的副本:

return *this

返回值类型 类名

当类的成员函数返回对象的副本时,它创建并返回当前对象或操作结果的一个新实例。这种做法适用于不希望外部修改原始对象,或需要返回一个局部修改后状态的场合
值语义:与返回引用或指针相比,返回副本强调了值语义,即每个对象都拥有自己的状态

缺点:链式调用难以判断

#include <iostream>using namespace std;class MyClass
{
private:int num1;public:MyClass(){num1 = 0;}// 返回值类型为 MyClassMyClass change(){num1 += 1;// 表示当前对象副本return *this;}void show(){cout << num1 << endl;}
};
int main()
{MyClass mc1;// 1 mc1的num1+1=1// 2 复制副本 副本num1+1=2// 3 显示副本的 num1=2// 4 临时副本销毁mc1.change().change().show();// 此时观察num1的值为1:mc1.show(); // 1// 1 mc1的num1+1=2// 2 复制副本 副本num1+1=3// 3 显示副本 num1=3// 4 临时副本销毁mc1.change().change().show();// 此时观察num1的值为2:mc1.show(); // 2// 1 mc1的num1+1=3// 2 复制副本 副本num1+1=4// 3 显示副本 num1=4// 4 临时副本销毁mc1.change().change().show();// 此时观察num1的值为3:mc1.show(); // 3return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j-01

Neo4j是&#xff1a; 开源的&#xff08;社区版开源免费&#xff09;无模式&#xff08;不用预设数据的格式&#xff0c;数据更加灵活&#xff09;noSQL&#xff08;非关系型数据库&#xff0c;数据更易拓展&#xff09;图数据库&#xff08;使用图这种数据结构作为数据存储方…

基于java的某超市进销存管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

opencv对图片更换背景图(底色)

目录 一:背景和原理 二:代码实现 三:完整代码 四:注意事项 一:背景和原理 现实工作中,有时需要更换照片

lovesql 手工sql注入

1.页面 2.万能密码登录成功 我还傻乎乎的以为密码就是flag 但不是 3. 继续注入 判断列数 确定了只有三列 开始尝试联合注入 4.使用联合注入之前先判断显示位 5.之后一步一步的构造&#xff0c;先得到当前数据库名 利用database&#xff08;&#xff09; 再得到库里有哪些表 …

前端保留两位小数

一、保留两位小数&#xff08;四舍五入&#xff09; 解决方案&#xff1a;使用 toFixed(x) 方法可以对小数进行指定位数保留&#xff0c;其中x是要保留的位数用法&#xff1a;num.toFixed(x)&#xff0c;其中num为需要操作的数据&#xff0c;x为要保留的位数示例&#xff1a;1…

20240410解决OK3588-C的核心板刷机之后无法启动的问题

20240410解决OK3588-C的核心板刷机之后无法启动的问题 2024/4/10 19:38 1、编译OK3588的LINUX/Buildroot&#xff1f;forlinxubuntu: ~/3588/OK3588_Linux_fs$ sudo ./build.sh BoardConfig-linuxfs-ok3588.mk 2、进行全编译 forlinxubuntu: ~/3588/OK3588_Linux_fs$ sudo ./bu…

7-43 计算阶乘和

对于给定的正整数N&#xff0c;需要你计算 S1!2!3!...N!。 输入格式&#xff1a; 输入在一行中给出一个不超过10的正整数N。 输出格式&#xff1a; 在一行中输出S的值。 输入样例&#xff1a; 3输出样例&#xff1a; 9 #include <stdio.h> int main () { int …

Python:迭代器

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 迭代器在Python中是一种基本但却经常被忽视的概念。它们是Python处理集合数据的基石&#xff0c;无论是简单的列表还是复杂的自定义数据结构。理…

互联网轻量级框架整合之MyBatis核心组件

在看本篇内容之前&#xff0c;最好先理解一下Hibernate和MyBatis的本质区别&#xff0c;这篇Hibernate和MyBatis使用对比实例做了实际的代码级对比&#xff0c;而MyBatis作为更适合互联网产品的持久层首选必定有必然的原因 MyBatis核心组件 MyBatis能够成为数据持久层首选框&a…

Css3梳理篇——animation(动画)

1、 animation name --动画名 duration --设置动画所需时间&#xff08;先&#xff09; timing-function --动画类型(线性 linear) delay --延迟时间&#xff08;后&#xff09; iteration-count --动画的播放次数(无限循环 infinite / n --n次) direction --方向(正向/反向rev…

每日一题(leetcode1702):修改后的最大二进制字符串--思维

找到第一个0之后&#xff0c;对于后面的子串&#xff08;包括那个0&#xff09;&#xff0c;所有的0都能调上来&#xff0c;然后一一转化为10&#xff0c;因此从找到的第一个0的位置开始&#xff0c;接下来是&#xff08;后半部分子串0的个数-1&#xff09;个1&#xff0c;然后…

电力系统卫星授时信号安全隔离装置防护方案

电力系统是国家关键基础设施&#xff0c; 电力安全关系国计民生&#xff0c; 是国家安全的重要保障&#xff0c; 与政治安全、经济安全、 网络安全、社会安全等诸多领域密切关联。电网运行情况瞬息万变&#xff0c;为了在其发生事故时能够及时得到处理&#xff0c;需要统一的时…

vue2 二次封装element 组件,继承组件原属性,事件,插槽 示例

测试页面代码 这里主要记录如何封装element的el-input 并且封装后具有el-input原本的属性 事件 插槽 下面为测试页面即组件调用 <script> import CustomInput from /components/CustomInput.vue;export default {name: TestPage,components: { CustomInput },data() …

jvm中jdk常用的几个命令总结

1.jmap 此命令可以用来查询内存信息&#xff0c;实例个数及占用内存大小 1.1 查看堆内存概要信息&#xff08;内存分配统计&#xff09; jmap -histo[:live] <pid> .-histo&#xff1a;显示堆中对象的统计信息&#xff0c;包括每个类的实例数量、占用内存大小等 :live…

从入门到弃坑:一个后端开发到鸿蒙开发的简单尝试

【摘要】 笔者说&#xff1a;因为本人也从未接触 Android 开发&#xff0c;所以本文也是从小白入门的角度学习 HarmonyOS开发&#xff0c;文中大量的内容和观点其实都可以从官方文档查阅到。写这篇文章大概也是从中精简内容&#xff0c;记录学习 HarmonyOS 的过程。 鸿蒙操作系…

四大生成式模型的比较——GAN、VAE、归一化流和扩散模型

比较四大模型的本质 four modern deep generative models: generative adversarial networks, variational autoencoders, normalizing flows, and diffusion models 待写

解析oracle的DDL语句生成高斯内表及表字段主键配置

oracle的DDL语句如下: CREATE TABLE TPPROD.CONFIG (NO VARCHAR2(50),CONFIGCODE VARCHAR2(400),CONFIGVALUE VARCHAR2(400),CONSTRAINT PK_GUENDORASSISTCONFIG PRIMARY KEY (NO,CONFIGCODE) ); CREATE UNIQUE INDEX PK_GUENDORASSISTCONFIG ON TPPROD.GUENDORASSISTCONFIG (…

GPT知识库浅析

一、引言 上篇文章《GPT简介及应用》介绍了GPT的应用场景&#xff0c;里面提到GPT bot的基本使用&#xff1a;基于GPT训练好的数据&#xff0c;回答用户的问题。 但在使用过程中&#xff0c;如果用户的问题里面出现最新的术语&#xff0c;就会出现这种提示&#xff1a; 截至我…

queryWrapper and和or嵌套查询

在使用MyBatis-Plus时&#xff0c;我们可以通过QueryWrapper来构建复杂的查询条件&#xff0c;其中可以使用and和or来嵌套条件。以下是一个使用and和or嵌套条件的例子&#xff1a; 1. and ( ... or ... or...) 格式 import com.baomidou.mybatisplus.core.conditions.query.Q…

基于SpringBoot的“酒店管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“酒店管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 系统首页界面图 用户注册界面图 个人…