【C++】之类和对象 - this指针

本文详细解析了C++中的this指针,包括其引入原因、定义、实质,以及在成员函数中的使用和面试中常被问到的问题,如this指针的位置、是否可以为空以及Print1和Print2函数的错误分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.this指针的引出

1.为什么要有this指针?

2.什么是this指针?

二.this指针的实质

三.this指针面试题


一.this指针的引出

1.为什么要有this指针?

在上面的代码中可以看出,我们用Date类,实例化两个对象分别是d1,d2。成员函数是放在公共代码区中的,对象调用函数不会解引用去对象中找,那么在d1调用DateInit和Print时,如何确保让编译器知道是d1调用的,而不是d2呢?

答案就是:C++中,通过引入this指针,来解决此类问题

2.什么是this指针?

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

可以看到this指针在两个对象调用函数时,是两个不同的地址。

通过打印的结果可以看到,this指针与对象地址相同,由此我们可以讨论一下this指针的底层实现

二.this指针的实质

this指针的类型:类的类型* const this

1.this指针只能在成员内部使用

2.this指针不能改变指向

3.this指针本质上是一个成员函数的形参,是在对象调用成员函数时,将自身地址传递给形参(也就是this指针),所以对象中不会存储this指针

4.this指针是成员函数第一个隐藏的指针形参,一般情况有编译器ecx寄存器自动传递,不需要用户手动操作

三.this指针面试题

1.this指针存在哪里??

答:this指针是成员函数的一个形参,只要是形参,就是实参的临时拷贝,在对象调用成员函数时,会建立函数栈帧,此时将实参也就是对象地址传递给形参发生临时拷贝,形参也就是this指针会建立在栈区,等函数结束时,函数栈帧会被销毁,同时形参也会被销毁。

2.this指针可以为空吗??

答:this指针可以为空,可以直接将一个空指针传递给成员函数。

3.说一下Print1和Print2有没有问题,哪里错了,为什么错??

class Date
{
public:
	void Print1()
	{
		cout << "hello this" << endl;
	}
	void Print2()
	{
		cout << _day << endl;
	}
private:
	int _year = 1;
	int _month = 1;
	int _day = 1;
};

int main()
{
	Date* p = nullptr;

	p->Print1(); 
	p->Print2();

	return 0;
}

答:首先p是一个空指针,Print1和Print2这两个成员函数都是通过这个空指针调用的,在指针对象p调用成员函数时,因为p本身就是指针,所以会把p传递给this指针,此时this为nullptr,Print1函数没有对this有解引用操作不会报错,而Print2中打印_day,实际则是this->_day,对空指针解引用,程序崩溃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值