C++:this指针

news2024/9/24 15:20:10

目录

前言

成员函数返回this指向的对象本身时,为什是返回引用类型?

成员函数返回this对象本身时,内部通常会通过拷贝构造函数来创建一个临时对象?

总结


前言

c++通过提供特殊的对象指针,this指针 指向被调用的成员函数所属的对象

  • this指针是隐含每一个非静态成员函数内的一种指针
  • this指针不需要定义,直接使用即可
  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this

成员函数返回this指向的对象本身时,为什是返回引用类型?

        类似于 &b=a,修改b同时就是修改a,完全可以把b当做a,b就是a本身,但是如果返回的不是引用,就是 b=a,那就是创造一个新的变量。不能把b当做a用,所以类型去掉引用返回的不是b本身,而是b的副本

        当你直接返回一个 Person 对象时,每次调用 PersonAddPerson 函数都会创建一个新的 Person 对象。这是因为函数返回的是一个临时对象(即在函数内部创建的),而不是原对象本身。

        在 C++ 中,函数的返回值通常会通过拷贝构造函数(copy constructor)或移动构造函数(move constructor)生成一个临时对象。这样做是为了保证函数返回的对象是有效的且能够被使用。

        因此,如果 PersonAddPerson 函数直接返回一个新创建的 Person 对象,每次调用函数时都会生成一个临时对象。这样的设计可能会引入额外的资源开销,包括内存分配和对象构造等。

        如果你希望在原对象上进行修改而不是返回新对象,你可以使用引用类型作为函数的返回类型。通过返回引用类型,函数可以直接操作并修改原对象。这样可以避免创建新对象和资源开销。

#include <iostream>
using namespace std;


class Person
{
public:

	Person(int age)
	{
		// 1、当形参和成员变量同名时,可用this指针来区分
		this->age = age; // this->成员,类似结构体指针访问成员
	}

	Person& PersonAddPerson(Person p)
	{
		this->age += p.age;
		return *this; // 返回对象本身
	}

	int age;
};

void test01()
{
	Person p1(10);
	cout << "p1.age = " << p1.age << endl; // 10

	Person p2(10);
	/* 链式调用,第一次得到20,返回p2本身,再继续调用,最终加两次得到40(如果返回的是Person类型,这里得到的是20)*/
	p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);
	cout << "p2.age = " << p2.age << endl; // 40
}

int main() {

	test01();

	return 0;
}

成员函数返回this对象本身时,内部通常会通过拷贝构造函数来创建一个临时对象?

        当一个函数返回一个对象时,编译器会使用拷贝构造函数来生成该返回对象的副本。拷贝构造函数是一个特殊的类成员函数,用于将一个对象的数据成员的值复制到另一个对象中。

假设我们有一个简单的类 Person,具有一个 name 字符串成员变量:

		class Person {
		public:
			std::string name;
			Person(const std::string& n) : name(n) {}
			// 拷贝构造函数
			Person(const Person& other) : name(other.name) {}
		};
		// 现在,我们有一个函数 getPerson(),它返回一个 Person 对象:
		Person getPerson() {
			Person p("Alice");
			return p;
		}

        在这个例子中,当 getPerson() 函数被调用时,它会创建一个 Person 对象 p,并将其初始化为 "Alice"。然后,函数将返回 p。

        在返回的过程中,编译器会使用拷贝构造函数来生成返回对象 p 的副本。这意味着在调用 getPerson() 后,将会创建一个新的 Person 对象,其中的 name 字符串值被复制为 "Alice"。这是因为我们不能直接返回函数内部的局部对象 p,因为它是在函数结束后将被销毁的。

        因此,拷贝构造函数在这里的作用是在函数返回对象时,根据已有对象的值创建一个新的对象,确保返回的对象是有效且具有正确的值。

总结

this指针是一个特殊的指针,用于访问当前对象的成员。它提供了一种便捷的方式来引用当前对象的成员变量和成员函数,并解决名称冲突的问题。

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

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

相关文章

模块二——滑动窗口:438.找到字符串中所有字母异位词

文章目录 题目描述算法原理滑动窗口哈希表 代码实现 题目描述 题目链接&#xff1a;438.找到字符串中所有字母异位词 算法原理 滑动窗口哈希表 因为字符串p的异位词的⻓度⼀定与字符串p 的⻓度相同&#xff0c;所以我们可以在字符串s 中构造⼀个⻓度为与字符串p的⻓度相同…

每日好题:原来你也玩三国杀(DP动态规划)

I - 原来你也玩三国杀 Description 小 Q 最近听说 “很多” acmer 都爱上了一款游戏《三国杀》。因为小 Q 是一个初学者&#xff0c;所以想自己先偷偷学习一下&#xff0c;然后惊艳所有人。但又因为小 Q 不屑于使用一般的武将&#xff0c;因为他觉得唯有操作型武将才能显得自…

虾皮选品网:如何使用虾皮选品数据软件提升您的选品策略

在虾皮&#xff08;Shopee&#xff09;平台上进行选品时&#xff0c;了解市场趋势、竞争程度和产品潜力是非常重要的。为了帮助卖家更好地分析虾皮市场&#xff0c;并为选品和运营策略提供有力支持&#xff0c;有一些数据软件和工具可以派上用场。本文将介绍一些建议使用的虾皮…

Kafka-集群架构设计

Kafka的Zookeeper元数据梳理 zookeeper整体数据 Kafka将状态信息保存在Zookeeper中&#xff0c;这些状态信息记录了每个Kafka的Broker服务与另外的Broker服务 有什么不同。通过这些差异化的功能&#xff0c;共同体现出集群化的业务能力。这些数据&#xff0c;需要在集群中各个…

DS二分查找_搜索二维矩阵(纯二分查找写法)

本题我写了两个方法&#xff0c;一个是的时间复杂度,就是本文章一个mn时间复杂度&#xff0c;这个比较简单&#xff0c;如果不会二分法可以看这篇文章 Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性&#xff1a; 1. 每行中的整数…

智物发布MT6877平台无线AR智能眼镜参考设计,推动下一代无线AR发展

随着增强现实(AR)技术的不断发展&#xff0c;有线AR眼镜在连接和使用方面存在一些限制。为了解决这些问题&#xff0c;无线AR智能眼镜的推出势在必行。 新一代无线AR智能眼镜采用了天玑900&#xff08;MT6877&#xff09;平台作为参考设计&#xff0c;搭载了2.4GHz的八核处理器…

【每日一题】用邮票贴满网格图

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二维前缀和二维差分 写在最后 Tag 【二维前缀和】【二维差分】【矩阵】【2023-12-14】 题目来源 2132. 用邮票贴满网格图 题目解读 在 01 矩阵中&#xff0c;判断是否可以用给定尺寸的邮票将所有 0 位置都覆盖住&…

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统&#xff0c;虚拟惯性和下垂控制&#xff0c;也可加入虚拟同步机VSG控制&#xff0c;飞轮储能容量可调&#xff0c;系统频率50Hz&#xff0c;离散模型&#xff0c;仿真运行速度快。 飞轮储能变流器采用双PWM环设计&#xff0c;并网电压电…

CleanMyMac2024绿色免费激活码序列号

2024CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关&#xff0c;但是我之前没有接触过&#xff0c;我看了这一篇很好的文章&#xff0c;看完之后写的答案。 我觉得很好的总结&#xff1a; dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

HPV为什么无症状?皮肤性病科专家谭巍解读具体原因

HPV&#xff0c;即人乳头瘤病毒&#xff0c;是一种常见的性传播疾病。然而&#xff0c;并不是所有感染HPV的人都会出现症状。为什么有的人感染HPV没有症状呢? 首先&#xff0c;需要了解的是&#xff0c;HPV感染是一种非常常见的现象。事实上&#xff0c;大约有80%的性活跃人群…

SLAM学习——相机模型(针孔+鱼眼)

针孔相机模型 针孔相机模型是很常用&#xff0c;而且有效的模型&#xff0c;它描述了一束光线通过针孔之后&#xff0c;在针孔背面投影成像的关系&#xff0c;基于针孔的投影过程可以通过针孔和畸变两个模型来描述。 模型中有四个坐标系&#xff0c;分别为world&#xff0c;c…

智能指针管理“newed对象”

为什么要有智能指针&#xff1f; 指针智能是管理管理动态内存分配对象的一种机制。它提供了自动管理内存&#xff0c;避免常见内存泄漏和悬空指针。 对于上述Func函数的操作&#xff0c;一不小心就会产生很多问题。 p1 new时候抛异常 什么都不做p2 new时候抛异常 p1需要被清理…

SpringBoot 接口实现幂等性,实现的四种方案!

什么是接口幂等性 在HTTP/1.1中&#xff0c;对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果&#xff08;网络超时等问题除外&#xff09;&#xff0c;即第一次请求的时候对资源产生了副作用&#xff0c;但是以后的多次请求都不会再对资…

3-分布式存储之Ceph

任务背景 虽然使用了分布式的glusterfs存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储. 任务要求 1, 搭建ceph集群 2, 实现对象存储的应用 任务拆解 1, 了解ceph 2, 搭建ceph集群 3, 了…

【docker】 docker部署minio对象存储并用rclone同步

docker部署minio对象存储并用rclone同步 1.什么是minio&#xff1f; minio是一个开源的对象存储服务器&#xff0c;兼容S3协议。 官网&#xff1a;https://min.io/ 官方在开源的基础上也提供云端S3服务&#xff0c;分为个人和企业&#xff0c;有不同的收费标准。 1.1 自建对…

SQL注入【sqli靶场第15-19关】(四)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 接上文&#xff1a;SQL注入【sqli靶场第11-14关】(三) …

Liunx系统安装mysql数据库

一、环境检查 1、检查本地是否安装MySQL服务&#xff1b; 2、下载MySQL安装包&#xff1b; 3、查看下载的文件 4、解压MySQL文件 5、安装MySQL 6、检查MySQL数据库安装情况 7、启动MySQL 8、查看MySQL安装初始密码 9、登录MySQL 10、设置远程授权 11、关闭防火墙

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上&#xff0c;通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下&#xff1a; 照明功能&#xff1a;智慧灯杆可以实现智能调光、时段控制等功能&#xff0c;根据不同的需求自动调节照明亮度&#xff0c;提高照明效果&am…

Pytorch学习概述

目录 学习目标人工智能1. 智能&#xff08;Intelligence&#xff09;1.1 人类智能1.2 机器学习&#xff08;人工智能&#xff09;1.3 深度学习1.4 学习系统的发展历程传统的机器学习策略 2. 传统机器学习算法的一些挑战3. 神经网络的简要历史3.1 Back Propagation&#xff08;反…