1.this指针的引出
我们先来看以下代码:
class Test
{
public:
void SetData(int data)
{
m_data = data;
}
int GetData()
{
return m_data;
}
public:
int m_data;
};
void main()
{
Test t1, t2;
t1.SetData(10);
t2.SetData(20);
cout << t1.GetData() << endl;
cout << t2.GetData() << endl;
}
对于上述类,有这样的一个问题:
Test类中有SetDate与GetData两个成员函数,函数体中没有关于不同对象的区分,那当t1调用
SetDate函数时,该函数是如何知道应该设置t1对象,而不是设置t2对象呢?
我们通过引用
this指针
解决此问题,即:C++编译器给每个“
非静态的成员函数“增加了一个隐藏的
指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操
作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自
动完成。
class Test
{
public:
void SetData(int data)
{
this->m_data = data;
}
int GetData()
{
return this->m_data;
}
public:
int m_data;
};
void SetData(int data) 其原型就是void SetData(Test const *this,int data)
this指针是一个常指针,在成员函数内部不能修改this指向,this指针代表当前的对象,(谁来调用函
数,里面的this指针就是那个对象的地址),此时可以修改,this指针不能为空。
若this指针为空,我们来看
void SetData(int data)
{
this=nullptr;
m_data = data;
}
此时表示this指针谁都不代表,就会产生错误。
2.this
指针的特性
1. this指针的类型:类类型* const。
2. 只能在“成员函数”的内部使用。
3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。