栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

一.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,对空指针解引用,程序崩溃

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022027.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号