this指针
-
以下代码中定义了三个对象a,b,c. 因此有三个同样空间大小分别存放三个对象的数据成员。但是三个对象都同样调用了calCircle()函数.当不同对象的成员函数引用数据成员时,如何保证引用的是指定对象的数据成员呢?
-
在每一个成员函数中都包含一个特殊的指针,称为this指针,它是指向本类对象的指针。
this指针是一个特殊的隐含指针,它隐含在每一个类的非静态成员函数中(包括构造函数和析构函数),即类的每个非静态成员函数都有一个this指针指向调用这个成员函数的对象。 -
当一个对象调用成员函数时,编译系统先将对象的首地址赋给this指针,然后调用成员函数。在成员函数存取数据成员时,隐含的使用this指针,这样成员函数就能够通过this指针来访问目的对象的数据成员。
-
例如:当a调用成员函数calCircle()时,编译系统将对象a的起始地址赋给this指针,成员函数按照this指针的指向找到对象a的数据成员。因此,calCircle()函数计算PI *r * r时,实际上是执行: PI * (this->r) * (this->r),因为当前this指针指向a,因此相当于执行以下语句:PI *a.r *a.r 。
-
成员函数calCircle()的定义如下:
double Circle::calCircle()
{
return PI * r * r;
}
C++编译后把它处理为:
double Circle::calCircle(Circle * this)
{
return PI *(this->r) *(this->r);
}
即在成员函数的形参列表中增加了一个this指针。在调用该成员函数时,实际上是用以下方式调用的:a.calCircle(&a);
将对象a的地址传递给形参this指针,然后按this的指向去引用对象的数据成员。 -
上述的这些过程都是编译系统自动实现的,程序设计者不必人为的在形参中增加this指针,也不必将对象a的地址传递给this指针。同时,在需要的时候也可以显式的使用this指针。
#include <iostream>
using namespace std;
const double PI=3.1415926;
//this指针
class Circle{
private:
double r;
public:
Circle(double r1);//构造函数
~Circle(){ };
double calCircle();
};
Circle::Circle(double r1)
{
r=r1;
}
double Circle::calCircle()
{
return PI*r*r;
}
int main()
{
Circle a(5);
Circle b(8);
Circle c(10);
cout<<a.calCircle()<<endl;
cout<<b.calCircle()<<endl;
cout<<c.calCircle()<<endl;
return 0;
}