C++中this指针

在C语言中,定义一个日期类型的结构体,并给出设置和打印的方法
函数setDate和printDate中,第一个参数是一个结构体类型的指针,用来接收结构体类型变量的地址,通过这个参数就知道要调用这个方法给哪个变量来设置值或是打印。

#include<stdio.h>

struct Date {
	int year;
	int month;
	int day;
};
void setDate(struct Date* p,int year, int month, int day) {
	p->year = year;
	p->month = month;
	p->day = day;
}
void printDate(struct Date* p, int year, int month, int day) {
	printf("%d.%d.%d", p->year ,p->month ,p->day );
	printf("\n");
}
void main() {
	struct Date p1,p2,p3;
	setDate(&p1, 2020, 4, 13);
	setDate(&p2, 2021, 5, 20);
	setDate(&p3, 2032, 10, 1);
	printDate(&p1, p1.year, p1.month, p1.day);
	printDate(&p2, p2.year, p2.month, p2.day);
	printDate(&p3, p3.year, p3.month, p3.day);
}

在C++中定义一个简单的日期类

#include<iostream>
using namespace std;
class Date {
public:
	void setDate(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}
	void printDate(int year, int month, int day) {
		cout << year << "." << month << "." << day << endl;
	}
	void thisTest(...) {
		Date* const& rthis = this;
		cout << this << endl;
		cout << &rthis << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main() {
	Date p1,p2,p3;
	p1.setDate(2020, 5, 10);
	cout << &p1 << endl;
	p1.thisTest();
	
}

类中的两个方法并没有给出关于调用对象的标记,因为在内部C++编译器给每个成员函数增加了一个隐藏的指针参数,该指针指向调用该函数的对象,并通过指针去访问对象的成员变量。这个参数叫做this指针。

this指针的类型是 类类型*const ,只能在成员函数的内部使用,其本质是成员函数的一个形参,当对象调用成员函数时,将对象地址作为实参传递给形参。由编译器通过ecx寄存器自动传递。
写个方法看一下他们的地址
在这里插入图片描述
第一个是p1的地址,就是p1对象中第一个成员的地址。第二个是this指针指向的地址,两个的值相同,可以印证this指针的指向。第三个是this指针自身的地址。this指针在栈上。

this指针的值
在主函数中进行如下的操作,

	Date p1;
	Date* p = &p1;
	p->setDate(2020, 5, 10);
	p->printDate();
	p = nullptr;
	p->thisTest();

打印出来的this指针是空值
在这里插入图片描述
所以this指针是有可能为空的,总结一下,this指针的存在是为了区分当前成员函数内部访问的成员变量是属于哪个对象的。this指针如果为空了,后续程序如果调用需要访问成员变量的函数就会发生崩溃,如果当前的方法不访问任何成员变量,那程序不会崩溃。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值