我們再看例2-9所示的這段代碼(EX04.CPP):
例2-9
#include <iOStream.h>
class point
{
public:
int x;
int y;
point()
{
x=0;
y=0;
}
point(int a,int b)
{
x=a;
y=b;
}
void output()
{
cout<<x<<endl<<y<<endl;
}
void input(int x,int y)
{
x=x;
y=y;
}
};
void main()
{
point pt(5,5);
pt.input(10,10);
pt.output();
}
我們在point類中定義了一個input函數。在這個函數中,用參數x和參數y分別給成員變量x和y進行了賦值。在main函數中,先調用pt對象的input函數,接收用戶輸入的坐標值,然後調用output函數輸出pt對象的坐標值。
讀者可以思考一下這段程序的運行結果,然後編譯運行,看看結果和你所思考的結果是一樣的嗎?
有的讀者可能會認為在input(int x, int y)函數中,利用形參x和形參y對point類中的成員變量x和y進行了賦值,然而事實是這樣嗎?因為變量的可見性,point類的成員變量x和y在input(int x, int y)這個函數中是不可見的,所以,我們實際上是將形參x的值賦給了形參x,將形參y的值賦給了形參y,根本沒有給point類的成員變量x和y進行賦值,程序運行的結果當然就是“5,5”了。
如何在input(int x, int y)這個函數中對point類的成員變量x和y進行賦值呢?有的讀者馬上就想到,將input函數的參數名改一下不就可以了嗎?比如:將函數改為input(int a, int b),當然,這也是一種解決辦法。如果我們不想改變函數的參數名,那麼又如何去給point類的成員變量x和y進行賦值呢?
在這種情況下,可以利用C++提供的一個特殊的指針——this來完成這個工作。this指針是一個隱含的指針,它是指向對象本身的,代表了對象的地址。一個類所有的對象調用的成員函數都是同一個代碼段,那麼,成員函數又是怎麼識別屬於不同對象的數據成員呢?原來,在對象調用pt.input(10,10)時,成員函數除了接收2個實參外,還接收到了pt對象的地址,這個地址被一個隱含的形參this指針所獲取,它等同於執行this=&pt。所有對數據成員的訪問都隱含地被加上了前綴this->。例如:x=0; 等價於this->x=0。
利用this指針,我們重寫input(int x, int y)函數,結果如例2-10所示。
例2-10
#include <iOStream.h>
class point
{
public:
int x;
int y;
point()
{
x=0;
y=0;
}
point(int a,int b)
{
x=a;
y=b;
}
void output()
{
cout<<x<<endl<<y<<endl;
}
void input(int x,int y)
{
this->x=x;
this->y=y;
}
};
void main()
{
point pt(5,5);
pt.input(10,10);
pt.output();
}
再編譯運行,此時的結果就如預期所料了。