c++ this指针

news/2024/11/20 11:38:40/

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;}
}

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


http://www.ppmy.cn/news/66788.html

相关文章

如何使用AndroidStudio编写Java程序

文章目录 使用场景使用方法整体的思路具体的步骤经验总结使用场景 在开发Android项目中有时候需要写一些Java程序做示例或者验证,这里说的Java程序是指Java控制台程序,程序中带有独立的main()方法。如果把Java示例程序放到Android项目中那么需要运行整个项目才能编译Java示例…

2. 注解Annotation

Java注解(Annotation)又称为Java标注,是JDK5.0引入的一种注释机制.注解是原数据的一种形式,提供有关于程序但不属于程序本身的数据.注解对他们注解的代码的操作没有直接的影响. 声明方式 注解的声明方式使用interface关键字,举例说明: public interface MyInject{ }元注解 Ta…

IDEA “Cannot resolve symbol” 解决办法

系列文章目录 文章目录 系列文章目录前言一、Cannot resolve symbol是什么问题&#xff1f;二、第一步&#xff1a;检查Maven配置三、第二步&#xff1a;检查target四、 第三步&#xff1a;检查 project五、第四步&#xff1a;lombok 问题总结 前言 请耐心读完&#xff0c;也许…

网络路径下倾斜模型生产流程-空三计算,像控刺点

网络路径下倾斜模型生产流程-空三计算&#xff0c;像控刺点 1.新建工程 ①新建工程文件夹 确定本机的网络路径&#xff0c;如演示机为192.168.100.10 在网络路径下新建工程文件夹&#xff0c;如//192.168.100.10/e/YNPE27 在工程文件夹下&#xff0c;新建工程存储文件夹CC和照片…

驱动设计的思想:面向对象/分层/分离(以LED操作为例)

1. 面向对象 字符设备驱动程序抽象出一个file_operations结构体&#xff1b; 对于LED&#xff0c;写的程序针对硬件部分抽象出led_operations结构体。 2. 分层 上下分层&#xff0c;之前写的LED驱动程序就分为2层&#xff1a; ① 上层实现硬件无关的操作&#xff0c;比如注册…

Vue3-黑马(二)

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

代码可读性艺术在Andorid中的体现

前言 最近接手的一些项目,不同的人编码风格迥异,类里的变量、方法的定义穿插,注释极为稀少,更有一些变量和方法的命名非常近似,例如表示播放队列的"playQueue"和表示歌单的"playList",wtf? 这不是一个意思吗?一些回调的时机也不能直观的看出来,通常需要…

【华为OD机试真题】最小的调整次数(python版)100%通过率 超详细代码注释 代码解读

【华为OD机试真题 2022&2023】真题目录 @点这里@ 【华为OD机试真题】信号发射和接收 &试读& @点这里@ 【华为OD机试真题】租车骑绿道 &试读& @点这里@ 最小的调整次数 知识点队列栈 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 有一个特异性…