1. 程式人生 > >為什麼要用this指標,為什麼是const型別的

為什麼要用this指標,為什麼是const型別的

假設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指標是一個區域性資料,它的作用域僅在一個物件的內部