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

news/2025/2/23 2:50:44/

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

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.ppmy.cn/news/1414050.html

相关文章

11.java openCV4.x 入门- Imgcodecs之图像读写

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

Java异常处理机制详解:多层方法调用与异常传播(day23)

1.数组下标越界 2.多个处理异常 上面这两个代码的区别就是有无 System.out.println("抛出了NumberFormatException"); System.out.println("抛出了ArrayIndexOutOfBoundsException"); 第一种是不论捕获到哪种异常&#xff0c;都只会调用e.printStack…

自动化测试之httprunner框架hook函数实操

本篇介绍httprunner中hook函数的使用&#xff0c;以及通过编程能力实现建设自动化测试更全面的场景覆盖 前置&#xff1a; 互联网时代让我们更快的学习到什么是Httprunner 正文&#xff1a; 经过上文了解到这个框架怎么使用之后&#xff0c;我们开始来探讨一下我们为什么要用…

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng&#xff0c;允许从任何主机 % 连接&#xff0c;并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

无人机GB42590接收端 +接收端,同时支持2.4G与5.8G双频WIFI模组

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/首页-深圳四博智联科技有限公司-淘宝网https://shop144145132.taobao.com/?spma230r.7195193.1997079397.2.71f6771dJHT2r0 二、接口文档 单片机和模…

Linux CentOS 安装 MySQL 服务教程

Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc&#xff0c;全名GNU C Library&#xff0c;是大多数Linux发行版中使用的C库&#xff0c;为系统和应用程序提供核心的API接口。在Linux系统中&#xff0c;特别是在…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之②:数据治理之二(自动处理)

前述 在前文的multi Agents for Data Analysis的设计说起&#xff0c;本文将继续探索和测试借助llm实现基于私有知识库的数据治理全自动化及智能化。整体设计如下&#xff1a; 整个体系设计了3个Agent以及一个Planer&Execute Agent&#xff0c;第一个Agent用于从企业数据…

FPGA - 以太网UDP通信(一)

一&#xff0c;简述以太网 以太网简介 ​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​ 以太网类型介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有…