c++ this指针

this指针介绍:

c++中成员变量和成员函数分开存储,每一个非静态成员函数只会有一个实例,多个同类型对象共用这一个成员函数。那么代码怎么区分哪个对象调用自己呢?this指针由此应运而生。

c++通过提供对象指针,this指针。this指针指向被调用的成员函数所属的对象,当创建一个对象时,编译器会初始化一个this指针,指向创建的的对象,this指针并不存储在对象内部,而是作为所有非静态成员函数的参数。this指针不需要定义,直接使用即可。

当写下如此代码时

void Person::setName(string name) {
	_name = name;
}
string Person::getName() {
	return _name;
}

当创建对象per时,编译器会初始化一个this指针指向对象per,通过per调用成员函数setName()和getName()时,编译器会将this指针作为两个函数的参数,编译后的代码可以表现为如下形式。下面代码演示的过程是隐含的,由编译器完成。

void Person::setName(Person* this, string name) {
	this->_name = name;
}
string Person::getName(Person* this) {
	return this->_name;
}

this指针的用途

(1)防止成员变量和成员函数的形参重名带来的异常

void Person::setName(string name) {
	this->name = name;
}

如果不用this指针,编译器在赋值时无法区分成员变量和形参,如下会产生异常

void Person::setName(string name) {
	name = name;
}

(2)如果类的成员函数返回值为一个对象,则可以用return *this返回对象本身(需要引用的方式传回);

#include <iostream>
using namespace std;
#include<string>
class Person {
public:
	string name;
public:
	void setName(string name);
	string getName();
	Person& test(Person &person1);
};
void Person::setName(string name) {
	this->name = name;
}
string Person::getName() {
	return this->name;
}
Person& Person::test(Person &person1) {
	this->name += person1.name;
	cout << "this:" << this << endl;
	return *this;
}
int main() {
	Person person1;
	person1.setName("张三");
	Person person2;
	person2.setName("李四");
	cout << "调用person2.test(person1)传回的对象的地址:" << &(person2.test(person1)) << endl;
	cout << "person2的对象地址:" << &person2 << endl;
	cout << person2.getName();
	return 0;
}

 如果不用引用的方式传回,传回的就不是person2了,传回的是复制品

关于this指针的一些问题

当this指针为空时,有一个问题需注意

#include <iostream>
using namespace std;
#include <string>
class Person {
public:
	string name;
public:
	void f();
	void setName(string name);
};
void Person::f() {
	cout << "调用f(),没用到this指针是可以正常调用的" << endl;
}
void Person::setName(string name) {
	this->name = name;//无法正常调用,因为this指针为空,读取访问异常
}
int main() {
	Person *person = NULL;
	person->f();//可以正常调用
	person->setName("张三");//无法正常调用
}

当我们声明了Person *person = NULL后,person对象在调用函数时,this指针会指向person,this这时为空,在使用this的时候就有异常,改进如下

void Person::setName(string name) {
	if(this!=NULL){
	this->name = name;
	}
}

跳过此行代码不执行。。。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3D点云的基本操作(基于PCL编程)

知识储备 右手系 右手&#xff0c;拇指&#xff0c;食指&#xff0c;中指&#xff0c;分别是x,y,z的正方向。左手系则同理。 旋转矩阵 本质&#xff1a;两个坐标系之间的旋转关系。 用途&#xff1a;旋转点云。 原理&#xff1a;设传感器的坐标系为O1X1Y1Z1&#xff0c;设…

高分辨率光学遥感图像水体分类综述2022.03

本文是Water body classification from high-resolution optical remote sensing imagery: Achievements and perspectives的学习笔记。 相关资源被作者整理到&#xff1a;这里 文章目录 Introduction基本知识 挑战和机遇挑战1. 有限的光谱信息和小场景覆盖2. 形状、大小和分布…

【Python入门】Python循环语句(while循环的基础语法)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

Spring_jdbcTemplate基本使用

文章目录 一、导入spring-jdbc和spring-tx坐标二、创建数据库表和实体在applicationContext.xml中配置连接池和JdbcTemplate在test数据库中创建account表 三、创建JdbcTemplate对象四、执行数据库操作 一、导入spring-jdbc和spring-tx坐标 <dependency><groupId>o…

Gateway

Gateway Nacos配置管理 同一配置管理 在配置管理界面点击&#xff0b; 然后填写配置信息 配置获取步骤&#xff1a; 引入Nacos的配置管理客户端 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-…

【源码解析】SpringBoot整合AOP原理解析

AOP介绍 AOP&#xff08;Aspect Oriented Programming&#xff09;是基于切面编程的&#xff0c;可无侵入的在原本功能的切面层添加自定义代码&#xff0c;一般用于日志收集、权限认证等场景。 AOP基本概念 通知&#xff08;Advice&#xff09;: AOP 框架中的增强处理。通知…

力扣sql中等篇练习(十八)

力扣sql中等篇练习(十八) 1 银行账户概要 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT u.user_id,u.user_name,u.creditIFNULL(t1.c1,0) credit,case when u.creditIFNULL…

浅谈Hutool工具类

一、Hutool简介 Hutool是一个Java工具类库&#xff0c;它封装了很多常用的Java工具类&#xff0c;如加密解密、文件操作、日期时间处理、Http客户端等。它的目标是让Java开发变得更加简单、高效。 二、Hutool的特点 高效&#xff1a;提供了很多高效的工具类和方法。 简单&…

Vue3-黑马(二)

目录&#xff1a; &#xff08;1&#xff09;vue3-ref与reactive &#xff08;2&#xff09;vue3-基础-属性绑定与事件绑定 &#xff08;3&#xff09;vue3-基础-表单绑定 &#xff08;1&#xff09;vue3-ref与reactive ref函数可以把普通的数据变成响应式的数据&#xff0…

Springboot 自动装配流程分析

目录 1.基础知识&#xff1a; 2.具体代码执行流程 3.流程总结&#xff1a; 4.参考文章&#xff1a; 1.基础知识&#xff1a; springboot的自动装配是利用了spring IOC容器创建过程中的增强功能&#xff0c;即BeanFactoryPostProcessor&#xff0c; 其中的ConfigurationCla…

卡特兰数三个通项公式的推导

前提条件&#xff1a; 有两种操作&#xff0c;一种操作的次数不能超过另外一个&#xff0c;或者是不能有交集这些操作的合法方案数&#xff0c;通常是卡特兰数 情景&#xff1a; 1&#xff09;n个0和n个1构成的字串&#xff0c;所有的前缀子串1的个数不超过0的个数&#xff…

redis(11)

一)基于Set集合实现点赞功能: 在我们的博客表当中&#xff0c;每一篇博客信息都有一个like字段&#xff0c;表示点赞的数量 需求: 1)同一个用户只能点赞一次&#xff0c;再次进行点赞则会被取消&#xff1b; 2)如果当前用户已经点赞过了&#xff0c;那么点赞按钮高亮显示&…

STL-deque容器

双端数组&#xff0c;可以对头端进行插入删除操作 deque 容器和 vecotr 容器有很多相似之处&#xff0c;比如&#xff1a; deque 容器也擅长在序列尾部添加或删除元素&#xff08;时间复杂度为O(1)&#xff09;&#xff0c;而不擅长在序列中间添加或删除元素。deque 容器也可…

win部署CAS服务并使用

前提描述&#xff1a;通过本次了解cas是个什么东西&#xff0c;并使用它。 cas为oss(单点登录)的一种实现方案。要实现cas单点登录&#xff0c;首先需要部署cas的server服务。 CAS是Central Authentication Service的缩写&#xff0c;中央认证服务&#xff0c;。 一、安装CAS…

VMware NSX-T Data Center 3.2.3 - 数据中心网络全栈虚拟化

VMware NSX-T Data Center 3.2.3 - 数据中心网络全栈虚拟化 重要更新&#xff1a;修复 136 个 bug。 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-nsx-t-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMwa…

OpenGL高级-实例化

知识点 假如你有一个有许多模型的场景&#xff0c;而这些模型的顶点数据都一样&#xff0c;只是进行了不同的世界空间的变换。想象一下&#xff0c;有一个场景中充满了草叶&#xff1a;每根草都是几个三角形组成的。你可能需要绘制很多的草叶&#xff0c;最终一次渲染循环中就肯…

【开源之夏 2023】欢迎报名 Dragonfly、Kata Containers、Nydus 社区项目!

开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;培养和发掘更多优秀的开发者。 活动联合国内外各大开源社区&#xff0c;针对重要开…

[一篇读懂]C语言十二讲:栈与队列和真题实战

[一篇读懂]C语言十二讲&#xff1a;栈与队列和真题实战 1. 与408关联解析及本节内容介绍1 与408关联解析2 本节内容介绍 2. 栈(stack)的原理解析2.1 **栈&#xff1a;只允许在一端进行插入或删除操作的线性表**2.2 栈的基本操作2.3 栈的顺序存储2.4 栈的链表存储 3. 初始化栈 -…

MySQL学习笔记

一、mysql环境安装 服务管理工具&#xff08;省略&#xff09; 二、Mysql DB2 Sybase Oracle SQL Server Mysql Access MangoDB(noSQL) Apache/nginx服务器&#xff1a; LAMP LinuxApacheMysqlPHP LNMP LinuxNginxMysqlPHP WAMP windowApacheMysqlPHP SQL: DDL(数据定…

【进程间通信 之 通信的建立】

目录&#xff1a; 前言进程间通信的目的进程间通信的方式管道1.匿名管道简单示例1 - 消息传输五个特性四种场景简单示例2 - 进程控制对管道的深入理解 2.命名管道简单示例3 -- 不相关进程间通信 system V共享内存简单示例4 - 通知事件消息传输 总结 前言 打怪升级&#xff1a;…