为什么要用this指针,为什么是const类型的

来源:互联网 发布:淘宝店铺怎么卖东西 编辑:程序博客网 时间:2024/05/19 04:29

假设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指针是一个局部数据,它的作用域仅在一个对象的内部