一、this指针的定义及用法

我们知道在C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。

那么问题是:这一块代码是如何区分哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针,this指针不需要定义,直接使用即可。

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this
#include<iostream>
using namespace std;
 
class Person {
public:
	Person(int age){
		//1、当形参和成员变量同名时,可用this指针来区分
		this->age = age;
	}
 
	Person& PersonAddPerson(Person p){
		this->age += p.age;
		//返回对象本身
		return *this;
	}
	int age;
};
 
int main() {
	Person p1(10);
	cout << "p1.age = " << p1.age << endl;
 
	Person p2(20);
	p2.PersonAddPerson(p1).PersonAddPerson(p1);	//20+10+10=40 
	cout << "p2.age = " << p2.age << endl;
	return 0;
}

二、this指针的本质--指针常量

this指针的本质是一个指针常量:const Type* const pointer; 

他储存了调用他的对象的地址,并且不可被修改。这样成员函数才知道自己修改的成员变量是哪个对象的。

例如:调用date.SetMonth(9) <===> SetMonth(&date, 9),this指针帮助完成了这一转换,使得this指针指向了调用对象data。

 

三、this指针的特点

1.只能在成员函数中使用,在全局函数、静态成员函数中都不能使用 this 。

(this始终指向当前对象,静态成员函数属于类)

2. this 指针是在成员函数的开始前构造,并在成员函数的结束后清除 。

(和函数的其他参数生命周期一样)

3. this 指针会因编译器不同而有不同的存储位置,可能是栈、寄存器或全局变量 。

(编译器在生成程序时加入了获取对象首地址的相关代码并把获取的首地址存放在了寄存器中)

4. 关于this指针的一个经典回答:

当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子的全貌 ,你看不到了。   
对于一个对象(也就是类的实例)来说,你可以看到它的成员函数、成员变量,但是看不到对象本身了。
所以有了this指针,它时时刻刻指向你这个对象本身。

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐