this指针

目录

  • this指针
    • 1、this指针的引出
    • 2、this指针的作用
    • 3、注意细节

this指针

1、this指针的引出

先来看一段代码:

#include
using namespace std;
class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	int main() {

	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2022, 1, 12);
	d1.Print();
	d2.Print();
	return 0;
}

上面代码运行后运行结果如下:
this指针_第1张图片

看到这里我们不禁提出提出疑问,编译器是怎么识别输出的???

2、this指针的作用

这是因为c++有一个this指针来帮助识别,将上面的代码变成了如下:
this指针_第2张图片
在这里插入图片描述
这样是不是就更加明了了,是this指针来帮助我们来进行识别的,只不过是编译器帮助我们做了这个工作,但是在编写程序中我们不要将this指针写出来,上边只是为了理解所以我将this指针写出来了。

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

3、注意细节

this指针不能显示的写实参和形参,但是可以在类里面显示的使用。
例如:
在这里插入图片描述
这里就将void*this去掉了,但是下面访问成员变量又用了this指针,这也就证明this指针确实是存在的。

另外this指针不是存在于对象中,而是存在于栈帧中。

一个题来帮助理解this指针:

#include
using namespace std;
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
	void PrintA()
	{
		cout << "printfA()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

运行结果如下:
this指针_第3张图片

这里这个程序是正常运行,因为成员变量在类的对象中,但是成员函数不在类的对象中,这里虽然将对象的指针p给置为空指针了,但是并不影响调用成员函数。
下面将这个题进行改动:

#include
using namespace std;
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->PrintA();
	return 0;
}

这里运行崩溃了,为什么?
因为这里的对象的指针p置为空了,那么this指针就为空,就找不到成员变量_a了。

你可能感兴趣的:(1024程序员节)