C++ 中的隐含 *this

什么是 this 指针?

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时"自动"调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问;this 指针是隐含在类的成员函数形参列表中,并未显式定义,编译器在执行相应操作时会自动调用。

接下来以 Date 日期类来说明 :

class Date {
public:
	Date(int year=1900, int month=10, int day=3)   //构造函数,全缺省构造
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d)   //拷贝构造
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	void PrintDate()    //打印日期
	{
		cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};
void test()                //测试代码
{
	Date d(2020, 10, 22);
	d.PrintDate();
	Date d1 = d;
	d1.PrintDate();
}
int main()
{
	test();
	return 0;
}

这是一段简单的的包含构造函数、拷贝构造函数以及打印日期函数的Date 日期类,首先观察到私有成员 private 中只定义了一个日期所包含的年、月、日,并未定义*this ,但是却在打印时候调用了 this 指针,那是否可以进行日期的打印呢?

我们来调试看看:

在这里插入图片描述
可以看出这里的确完成了打印目的,并且没有任何的错误提示,那是如何完成的,来进行分步调试看看:

一、当在 类内调用成员函数

(一)、Date 日期类成员函数 ---- 构造函数

当调用构造函数进行 Date d 构造时,*this 指向的空间与 d 的地址是相同的:
在这里插入图片描述

(二)、 Date 日期类成员函数 ---- 拷贝构造函数

当执行 d1=d 时调用了拷贝构造函数,同时 *this 指向了 d1 变量的空间,并且是 编译器自动进行调用的,并最终完成了 拷贝:
在这里插入图片描述

(三)、Date 日期类成员函数 — 打印函数

打印 d1 时调用打印函数又自动调用 *this
在这里插入图片描述

可以看出上述三例,我执行的操作都是在类内部的成员函数进行操作的,那如果是在类外进行调用,是否同样存在 *this ?

二、在成员函数外部

在这里插入图片描述

在这里插入图片描述

可以看出来,在类的成员函数外部定义使用 this 指针时会发生错误提示,错误信息为:
在这里插入图片描述

三、查看反汇编语言

this 指针是成员函数隐含的形参,使用时将对象的地址传给 this 指针,由编译器自动调用:

构造函数:
在这里插入图片描述

在这里插入图片描述
打印函数:
在这里插入图片描述

由上述分析可知:
1、this 指针是隐含在类的成员函数内部--------形参,因而只有在调用成员函数时才会使用,在类外或成员函数外部是不可以被调用的;
2、this 指针使用时是将一个实参的地址传送给 *this ,因为 this 指针的内容是不可以被修改的;
3、this 指针,当我们定义了多个形参时候,为了区分我们要设置的是哪一个参数而产生的。

今天的分享就到这里,有任何问题都可以留言哦~

biubiubiu~~~~~

(今天依旧要元气满满,明天要更加努力行动,加油:致奋斗中的同胞!)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值