C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ this指针

一文详解C++中隐含的this指针

作者:仍在探索未知中

这篇文章主要带大家详细了解一下C++中隐含的this指针,文中通过代码示例和图文介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

一、this指针的引出

我们先来定义一个日期类Date,下面这段代码执行的结果是什么呢?

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
		
	}
private:
	int _year; 
	int _month; 
	int _day; 
};
int main()
{
	Date d1, d2;
	
	d1.Init(2022, 5, 11);
	d2.Init(2022, 5, 12);

	d1.print();
	d2.print();
	return 0;
}

可以看到分别打印出了两个日期,它是怎么知道改打印哪个的?

在这里插入图片描述

我们来分析一下,先看一下汇编代码,看一看

在这里插入图片描述

原形是这样:

在这里插入图片描述

在这里插入图片描述

二、this指针的特性

刚刚上面也给你看了原形,细心的烙铁已经发现了,这个this指针是有一个const修饰的,而且这个const是在*的右边

在这里插入图片描述

这里的const修饰

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

特点:

1、形参和实参的位置,我们不能显示写

2、函数内部可以使用

最后总结一下:

【面试题】

this指针存在哪里?

a、堆 b、栈 c、静态区 d、常量区 e、对象里面

在这里插入图片描述

那么什么在常量区呢?是const修饰的值在常量区,这个指针变量在栈区,指向了这个常量区的字符串的首字符,所以d也就排除

在这里插入图片描述

在这里插入图片描述

this指针可以为空吗?

下面我们来看两道题来解决这个问题的答案~

第一道:下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行

class A
{
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Print();
	return 0;
}

已经完美运行了,因为我这里没有访问类里的对象,所以可以正常运行

在这里插入图片描述

第二道:下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;

	}
private:
	int _a;
};

int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

这里引发了空指针,因为我需要打印这里的_a,就要找到那块空间

在这里插入图片描述

也就可以写成这样,this指针是空指针,解引用就会报错

在这里插入图片描述

所以this指针是可以为空的,只要在成员函数内部不访问其内容,程序可以正常执行的。

以上就是一文详解C++中隐含的this指针的详细内容,更多关于C++ this指针的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文