什么是 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~~~~~
(今天依旧要元气满满,明天要更加努力行动,加油:致奋斗中的同胞!)