為什麼要用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指標初始化為指向該物件
例如:
#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指標是一個區域性資料,它的作用域僅在一個物件的內部