在讲this指针之前我们先引入一个问题:
#include<iostream>
using namespace std;
class Test
{
public:
void SetData(int data)
{
m_data = data;
}
private:
int m_data;
};
int main()
{
Test t1, t2;
t1.SetData(10);
t2.SetData(20);
}
从上面的代码来看,我们用一个类分别定义了两个不同的对象,在类中有一个设置数据成员的成员函数,当我们分比用不同的对象调用这个成员函数时,怎么能保证设置的是当前对象的数据成员呢?
答:在类中每一个成员函数都包含一个特殊的指针,这个指针就是this,它是指向当前对象的指针,它是作为函数的参数将当前对象的地址传递给成员函数的。因此这就保证了是对当前对象的数据成员在操作。
那this指针在哪里?
this指针是在每个成员函数的参数中,因为this指针是隐式使用的,我们没有必要再函数参数中增加this,也不用将对象的地址传给this,所以我们看不见。这些都是编译系统自动实现的。
如下图所示,是将t1、t2的地址分别传给this指针
这里的this是常指针,不能改变this的指向,这就保证了this一直指向当前对象
#include<iostream>
using namespace std;
class Test
{
public:
//void SetData(Test * const this,int data)
void SetData(int data)
{
this->m_data = data;
}
private:
int m_data;
};
int main()
{
Test t1, t2;
t1.SetData(10);//SetData(&t1,10)
t2.SetData(20);//SetData(&t2,10)
}
当数据成员和成员函数的参数同名时我们会看到下面这种情况,这是因为在SetData函数中他会将等式两边的data都认为是形参,当出了函数作用域两个都会被释放,因此t1、t2的data都是随机数。
#include<iostream>
using namespace std;
class Test
{
public:
void SetData(int data)
{
data = data;
}
private:
int data;
};
int main()
{
Test t1, t2;
t1.SetData(10);
t2.SetData(20);
}
如果要解决这种问题我们可以:
void SetData(int data)
{
this->data = data;
}
但是我们在定义数据成员时最好还是有所区分/