关于this指针的一个经典回答
当你进入一个【房子】后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的【成员函数】、【成员变量】,
但是实例本身呢?
this是一个【指针】,它时时刻刻指向你这个【实例】本身
this指针基本用法
class Date
{
public:
void SetDate(int year, int month, int day)
{
this->year = year;
this->month = month;
this->day = day;
}
void PrintDate()
{
cout<<year<<"-"<<month<<"-"<<day<<endl;
}
private:
int year;
int month;
int day;
};
在上面这则代码中,我们定义了一个 【日期类】Date
在构造函数 Date(int year,int month,int day) 中
由于【参数名】和【私有成员名】同名
我们利用this指针将【私有成员】和【参数】分开
这便是this指针的基本用法
this指针是哪里来的,编译器如何生成this指针
让我们来看一下【反汇编】代码来探索this指针
对下面的主函数【调试】的时候进行反汇编
int main(void)
{
Date d1(2016,9,27);
system("pause");
return 0;
}
结果如下:
进过反汇编,我们知道了 【ecx】寄存器是存储 【对象d1】的地址的
也就是【this指针】所指向的内容
为什么设置this指针
让用this指针和C语言的【结构体】做一些对比
struct Date
{
int year;
int month;
int day;
};
void SetDate(Date* date, int _year, int _month, int _day)
{
date->year = _year;
date->month = _month;
date->day = _day;
}
我们对 【结构体】的成员进行赋值时
传入了该【结构体类型】的指针
才可以赋值
C++【this指针】也是这个作用
并且在类的成员函数中,会默认传入this指针
修改this指针
我们可不可以修改this指针指向的内容呢?
我们试着给this指针赋一个【NULL】吧~~【好刺激】
然而设计编译器的人早已【预料】到这个问题了。。。
所以
this指针的类型是
【Class * const】
对于this指针的总结
1.this指针隐含在每一个类的成员函数中,在【调用】该函数时创建,在该函数调用【结束】时销毁
2.this指针可以和传入的参数区分开
3.this指针被隐含的声明为 【Class * const this】 ,代表着不能给this指针进行赋值