假设Point类有getX这样一个非static函数:double Point::getX();实际上,成员函数在编译以后也要变成非成员函数,这也正是this指针的作用,用来接受调用对象的地址。也就是说,编译以后形式如下,当然函数名会变化,这里仅仅是想说明道理:double getX(Point *const this);因为在某次调用整个过程this指向都不允许改变(原因很简单,如果改变的话就不是这个对象调用的了),所以this就应该声明成const指针。
另外,如果是常函数也就是下面的定义:double Point::getX()const;编译后会变成:double getX(const Point *const this);因为不允许改变this指向内容的所以需要const Point。 通过代码总体理解下:
当定义了一个类的若干对象后,每个对象都有属于自己的数据成员,但是所有对象的成员函数代码却合用一份。那么成员函数是怎样辨别出当前调用自己的是哪个对象,从而对该对象的数据成员而不是对其他对象的数据成员进行处理呢?
例如:
#include <iostream.h>class A
{
public:
A(int x1)
{
x = x1;
}
void disp()
{
cout<<"x="<<x<<endl;
}
private:
int x;
};
main()
{
A a(1), b(2);
cout<<"a:";
a.disp();
cout<<"b:";
b.disp();
return 0;
}
结果:
a:x=1
b:x=2
执行a.disp()时,成员函数怎样知道现在对象a在调用自己?其实,不论对象a还是对象b调用disp()时,都执行同一条语句cout<<"x="<<x<<endl;,为什么在输出的时候不会搞乱?原来C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下,this指针是隐含存在的,也可以将其显示的表示出来。
例如:
#include <iostream.h>
class A
{
public:
A(int x1)
{
x = x1;
}
void disp()
{
cout<<"\nthis="<<this<<" when x="<<this->x;
}
private:
int x;
};
int main()
{
A a(1), b(2), c(3);
a.disp();
b.disp();
c.disp();
return 0;
}
输出结果:
this=0x0012FF7C when x=1
this=0x0012FF78 when x=2
this=0x0012FF74 when x=3
例如:
#include <iostream.h>class Sample
{
private:
int x, y;
public:
Sample(int i=0, int j=0)
{
x = i;
y = j;
}
void copy(Sample &xy);
void print()
{
cout<<x<<","<<y<<endl;
}
};
void Sample::copy(Sample &xy)
{
if (this!=&xy)
{
*this = xy;
}
}
void main()
{
Sample p1, p2(5,6);
p1.copy(p2);
p1.print();
}
输出结果:
5,6
说明:
1,this指针是一个const指针,不能再程序中修改它或给它赋值;
2,this指针是一个局部数据,它的作用域仅在一个对象的内部