this指针:
1.说明:当程序中一个类定义了多个对象,多个对象都调用类中同一个成员函数时,此时怎么区别这个成员函数在哪个对象上操作,C++提供了this指针。如:
class Data
{
public:
void SetData(int year,int month,int day)
{
_year=year;
_month=month;
_day=day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Data d1,d2;
d1.SetData(2016,9,25);
d2.SetData(2016,9,25);
return 0;
}
创建两个Data类对象d1,d2,都调用成员函数SetData()函数,此时它是在那一个对象上操作,this指针发生作用。
2.定义:每个类的成员函数都默认隐含定义了一个指针,当创建一个类对象并用对象调用成员函数时,这个指针就被初始化为这个对象的地址,使它指向调用函数的对象,这个指针被称为this指针。即如上段代码Data类中成员函数SetData(),它会在识别类时编译器对其进行改写,变为:
void SetDate(Date* const this, int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
struct Date
{
int _year;
int _month;
int _day;
};
void SetDate(<span style="color:#ff0000;">Date* _this</span>, int year, int month, int day)
{
_this->_year = year;
_this->_month = month;
_this->_day = day;
}
int main()
{
Date d1;
SetDate(<span style="color:#ff0000;">&d1</span>, 2016, 9, 26);
return 0;
}
上述代码创建结构体对象d1,在函数中传人d1地址,用_this指针接收,所以这两种实现方法是相同的。
由上也可总结出this指针—
3.特性:
(1)类型:类类型 *const(常量指针),this指针不能被修改和赋值(它存放的是某一个类对象地址);
(2)this指针是一个隐含指针,不能被显示声明,它是类成员函数的第一个默认隐含参数,在函数体内可隐含使用它来访问本类的数据成员和成员函数,它并由编译器自动维护传递;
(3)this指针是局部变量,局部每个对象,在任何非静态成员函数中都可见;
(4)this指针只有在对象调用成员函数时才被初始化重新定向,指向对象隐式传递到成员函数,进入不能再被修改;
(5)this指针并不是对象一部分,不影响sizeof 结果,它的作用域一般在类成员函数内部。