c++的this指针

this指针

this指针的介绍

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。–百度

this指针的特点

  1. this指针的作用?
    在c中我们实现一个栈时,需要我们自己传递栈的地址参数,这种操作涉及到大量指针地址的操作;为了简化操作在c++中我们实现栈时,编译器通过this指针隐式的自行传递对象的地址参数,所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
class Date
{
public:
void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{

	Date d1;
	d1.Init(1, 2, 3);//调用非静态成员函数时,this指针将对象d1的地址作
	//为函数的实参“隐式”传递给非静态成员函数的实参
	
	Date d2;
	d2.Init(1, 2, 0);
	return 0;
}
  1. this指针的类型?
    this指针的类型是* const ,指针的指向不能被改变,即成员函数中不能给this指针赋值,
  2. this存储在哪里?
    this指针一般被存储在栈(因为this一般隐式的作为第一个形参)中,
    在vs2022中, 由下图汇编代码可见编译器将参数从右往左压栈,d1对象的地址被放在rcx寄存器中。
    在这里插入图片描述

this指针的其他注意事项

  1. this指针只能在“成员函数”的内部使用
  2. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。

一个代码例子

class Date
{
public:
	void print()
	{
		cout<< "show()"<< endl;
    }
	
private:
	int _day;
};

int main()
{

	Date * p = nullptr;
	p->print();
	return 0;
}//运行崩溃

class Date
{
public:
	void print()
	{
		cout<< _day << endl;
    }
	
private:
	int _day;
};

int main()
{

	Date * p = nullptr;
	p->print();
	return 0;
}//正常运行

代码1不可以正常运行,因为成员变量存储在对象中,访问成员变量会将p作为实参传递给this指针,在遇到空指针时程序运行崩溃。
而代码2可以正常运行,因为所有类的成员函数放在代码区,不需要访问对象。

注意:所有类成员函数放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;余下的空间都被称为堆区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值