【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )
文章目录
- 一、全局函数 与 成员函数 相互转化
- 1、成员函数转为全局函数 - 多了一个参数
- 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数
- 二、有参构造函数设置默认参数值
- 三、返回匿名对象与返回引用
- 四、完整代码示例
一、全局函数 与 成员函数 相互转化
1、成员函数转为全局函数 - 多了一个参数
C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止 , 这个增加的参数是 对象本身的指针 ;
在 Student 类中 , 定义了如下函数 :
// 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数void print(){cout << "age = " << this->age << " , height = " << this->height << endl;}
将上述 Student 类 中的 print 成员函数 , 转为 全局函数 , 转换后的代码为 :
// 将成员函数 void print()
// 转为 全局函数
void Student_print(Student* pThis)
{cout << "age = " << pThis->age << " , height = " << pThis->height << endl;
}
转换完毕后 , 参数列表中增加了一个参数 Student* pThis 在 列表的开始位置 ;
详细代码 , 参考最后的完整代码示例 ;
2、全局函数转为成员函数 - 通过 this 指针隐藏操作数
全局函数转为成员函数 , 需要隐藏一个参数 , 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ;
在全局函数中 , 实现两个 Student 类相加 , 接收两个 Student 引用类型的参数 , 引用相当于一级指针 ;
// 全局函数中 , 将两个 Student 对象相加
// 引用的 等同于 一级指针 , Student 引用用法与 Student 对象用法相同
// 全局函数 转为 成员函数 , 少了一个参数
Student StudentPlus(Student& s1, Student& s2)
{Student s;s.age = s1.age + s2.age;s.height = s1.height + s2.height;return s;
}
转为成员函数后 , 成员函数 比 全局函数 少了一个参数 , 少的那个参数 , 就是对象本身 ;
// 成员函数中, 将两个 Student 对象相加// 全局函数 转为 成员函数 , 少了一个参数Student StudentPlus(Student& s2){Student s;s.age = this->age + s2.age;s.height = this->age + s2.height;// 注意 : 返回的是一个匿名对象return s;}
详细代码 , 参考最后的完整代码示例 ;
二、有参构造函数设置默认参数值
为 Student 类定义了有参构造函数 , 则其默认的无参构造函数 , 就不会生成 ;
// 带参构造函数Student(int age, int height){this->age = age;this->height = height;cout << "执行 Student 的构造函数" << endl;}
此时 , 如果要创建 Student 对象 , 只能调用上述 有参构造函数 , 如果使用 Student s2 的方式调用 默认构造函数 创建 Student 对象 , 就会报错 ;

如下带参数的构造函数 , 并且为其 有参构造函数 的参数 设置一个默认值 , 此时就可以使用 类名 对象名 的方式定义对象变量 ;
class Student
{
public:// 带参构造函数Student(int age = 0, int height = 0){this->age = age;this->height = height;cout << "执行 Student 的构造函数" << endl;}~Student(){cout << "执行 Student 的析构函数" << endl;}public:int age; // 年龄int height; // 身高
};
此时就可以使用默认构造函数 , 创建 Student 对象 ;

三、返回匿名对象与返回引用
在上面的章节中 , 将 两个 Student 对象相加 , 返回的是一个匿名对象 , 该匿名对象 是在 成员函数 中新创建的对象 ;
// 成员函数中, 将两个 Student 对象相加// 全局函数 转为 成员函数 , 少了一个参数// 返回一个新 Student 对象Student StudentPlus(Student& s2){Student s;s.age = this->age + s2.age;s.height = this->height + s2.height;// 注意 : 返回的是一个匿名对象return s;}
如果不返回新的对象 , 而是将 两个 对象相加 , 最终结果累加到 本对象中 , 则返回 Student 引用即可 ;
// 成员函数中, 将两个 Student 对象相加// 全局函数 转为 成员函数 , 少了一个参数// 两个 对象相加 , 最终结果累加到 本对象中Student& StudentPlus2(Student& s2){this->age = this->age + s2.age;this->height = this->height + s2.height;// 注意 : 返回的是一个引用 , 就是返回自身对象变量// this 是指针 , *this 是指针指向的 自身对象return *this;}
返回 引用 , 就是返回自身对象 ;
this 是指针 , *this 是指针指向的 自身对象 实际数据 ,
返回引用 , 就是返回 自身对象实际数据 *this ;
四、完整代码示例
代码示例 :
#include "iostream"
using namespace std;class Student
{
public:// 带参构造函数Student(int age = 1, int height = 1){this->age = age;this->height = height;cout << "执行 Student 的构造函数" << endl;}~Student(){cout << "执行 Student 的析构函数" << endl;}// 成员函数中, 将两个 Student 对象相加// 全局函数 转为 成员函数 , 少了一个参数// 返回一个新 Student 对象Student StudentPlus(Student& s2){Student s;s.age = this->age + s2.age;s.height = this->height + s2.height;// 注意 : 返回的是一个匿名对象return s;}// 成员函数中, 将两个 Student 对象相加// 全局函数 转为 成员函数 , 少了一个参数// 两个 对象相加 , 最终结果累加到 本对象中// 注意此处 : 函数重载 不以 返回值为标准 , 函数名需要修改Student& StudentPlus2(Student& s2){this->age = this->age + s2.age;this->height = this->height + s2.height;// 注意 : 返回的是一个引用 , 就是返回自身对象变量// this 是指针 , *this 是指针指向的 自身对象return *this;}// 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数void print(){cout << "age = " << this->age << " , height = " << this->height << endl;}public:int age; // 年龄int height; // 身高
};// 将成员函数 void print()
// 转为 全局函数
void Student_print(Student* pThis)
{cout << "age = " << pThis->age << " , height = " << pThis->height << endl;
}// 全局函数中 , 将两个 Student 对象相加
// 引用的 等同于 一级指针 , Student 引用用法与 Student 对象用法相同
// 全局函数 转为 成员函数 , 少了一个参数
Student StudentPlus(Student& s1, Student& s2)
{Student s;s.age = s1.age + s2.age;s.height = s1.height + s2.height;return s;
}int main() {// 调用有参构造函数 创建 Student 实例对象Student s(18, 180);// 打印对象情况s.print();// 调用有参构造函数 , 有参构造函数参数使用默认值Student s2;s2.print();// 调用全局函数, 将两个 Student 对象相加// 函数返回的 匿名对象 用于 s3 初始化 // 直接将匿名对象转为普通对象Student s3 = StudentPlus(s, s2);s3.print();// 调用成员函数, 将两个 Student 对象相加Student s4;// 函数返回的 匿名对象 用于 s4 赋值// 此处匿名对象 为 s4 赋值 , 赋值完毕后 匿名对象销毁s4 = s.StudentPlus(s2);s3.print();// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}
执行结果 :
执行 Student 的构造函数
age = 18 , height = 180
执行 Student 的构造函数
age = 1 , height = 1
执行 Student 的构造函数
执行 Student 的析构函数
age = 19 , height = 181
执行 Student 的构造函数
执行 Student 的构造函数
执行 Student 的析构函数
执行 Student 的析构函数
age = 19 , height = 181
请按任意键继续. . .

相关文章:
【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )
文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...
游戏遇到的问题
天涯明月刀 就是天刀的假全屏,很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多,不在意帧数,但是肯定还是有一部分玩家发现了这个问题,就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢࿱…...
高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40
binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表,用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念,并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…...
Linux系统编程——进程间通信的学习
学习参考博文: 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…...
人工智能AI 全栈体系(六)
第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂,应用领域越来越广,性能也越来越好,但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法,但是大体思路基本是一样的,只是对 BP 算法个别地方的一…...
NPDP是什么?考了有用吗?
1)NPDP是什么? NPDP,全称为New Product Development Professional,即新产品开发专业人员。NPDP认证是由世界产品开发协会(PDMA)推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...
关于安卓SVGA浅尝(二)加载数据
关于安卓SVGA浅尝(二)加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项…...
使用matlab产生二维动态曲线视频文件具体举例
使用matlab产生二维动态曲线视频文件举例 在进行有些函数变化过程时候,需要用到直观的动态显示,本博文将举例说明利用Matlab编程进行二维动态曲线的生成视频文件。 一、问题描述 利用matlab编程实现 y 1 s i n ( t ) , y 2 c o s ( t ) , y 3 s i …...
Selenium自动化测试框架常见异常分析及解决方法
01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …...
[TI] [Textual Inversion] An image is worth an word
自己的理解: 根据几个图像,找出来一个关键字可以代表它们,然后我们可以再用这个关键字去生成新的东西。 提出关键字 1 Introduction word->token->embedding Textual Inversion过程 需要: ① a fixed, pre-trained text…...
remote: The project you were looking for could not be found
git拉取公司项目时报错: remote: The project you were looking for could not be found 发生这个问题的原因,在于git账号可能并未真正登录。 我们可以通过打开电脑的凭据管理器,查看git当前的登录是否正常。 参考链接:参考...
https跳过SSL认证时是不是就是不加密的,相当于http?
https跳过SSL认证时是不是就是不加密的,相当于http?,其实不是,HTTPS跳过SSL认证并不相当于HTTP,也不意味着没有加密。请注意以下几点: HTTPS(Hypertext Transfer Protocol Secure)本质上是在HTTP的基础上…...
linux下链接
linux下链接用法 ln链接格式与介绍 linux下链接用法一、链接的使用格式二、链接的介绍 一、链接的使用格式 链接: 格式: ln 源文件 链接文件 硬链接 ln -s 源文件 链接文件 软连接 硬链接文件占磁盘空间 但是删除源文件不会影响硬链接文件 软链接文件不…...
OpenCV项目开发实战--主成分分析(PCA)的特征脸应用(附C++/Python实现源码)
什么是主成分分析? 这是理解这篇文章的先决条件。 图 1:使用蓝线和绿线显示 2D 数据的主要组成部分(红点)。 快速回顾一下,我们了解到第一个主成分是数据中最大方差的方向。第二主成分是空间中与第一主成分垂直(正交)的最大方差方向,依此类推。第一和第二主成分红点(2…...
多层感知机——MLP
源代码在此处:https://github.com/wepe/MachineLearning/tree/master/DeepLearning Tutorials/mlp 一、多层感知机(MLP)原理简介 多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN&…...
HttpClientr入门
HttpClientr入门 介绍 HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的,最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议的版本和建议。 依赖导入 <dependency><groupId>org.apache.…...
网关-开放API接口签名验证方案
接口安全问题 请求身份是否合法?请求参数是否被篡改?请求是否唯一? AppId&AppSecret 请求身份 为开发者分配AppId(开发者标识,确保唯一)和AppSecret(用于接口加密,确保不易被…...
Linux知识点 -- 网络基础 -- 传输层
Linux知识点 – 网络基础 – 传输层 文章目录 Linux知识点 -- 网络基础 -- 传输层一、传输层协议1.端口号2.网络相关bash命令 二、UDP协议1.UDP报文的解包与交付2.理解UDP报文3.UDP协议的特点4.UDP应用层IO类接口5.UDP的缓冲区6.UDP使用注意事项7.基于UDP的应用层协议 三、TCP协…...
计算机视觉与深度学习-经典网络解析-AlexNet-[北邮鲁鹏]
这里写目录标题 AlexNet参考文章AlexNet模型结构AlexNet共8层:AlexNet运作流程 简单代码实现重要说明重要技巧主要贡献 AlexNet AlexNet 是一种卷积神经网络(Convolutional Neural Network,CNN)的架构。它是由Alex Krizhevsky、Il…...
Django学习笔记-实现联机对战(下)
笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 CONTENTS 1. 编写移动同步函数move_to2. 编写攻击同步函数shoot_fireball 1. 编写移动同步函数move_to 与上一章中的 create_player 同步函数相似,移动函数的同…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
