struct到class進化的第一步
設想我們是十幾年前C++的設計者,從C的struct怎麼進化到C++的class?
struct裏可以用函數指針作成員變量,並通過諸如xxx->fun()的形式調用,但和class成員函數相比:1)不能在struct內部定義函數;2)不能在struct成員函數內直接訪問struct的其他成員變量。這兩點形式上的侷限使得struct無法直接體現面向對象的思想。怎麼解決呢?問題1)struct(class)實現內部定義函數由編譯器name mangling機制完成,後面講述,這裏講第2點。
struct Base
{
int a,b;
void add_mem() { return(a+b); };
};
假設可在struct內定義函數,那要在函數裏直接訪問成員a,b,順理成章的辦法就是設法把指向結構體變量自身的指針傳到成員函數內部,即由編譯器把函數add_mem()變成add_mem(void *this){ return(this->a+this->b); }
這個隱含的包含對象地址的參數就是this指針,C++編譯器就能自動獲取對象地址賦給this,再通過一個隱含參數把this傳進類的非靜態成員函數,於是函數內部訪問類的非靜態成員變量就可以藉助於this,如:
class Point
{
int x, y, z;
public:
Point(inta, int b, int c) { x=a; y=b; z=c; }
voidMovePoint( int a, int b, int c){ x+=a; y+=b; z+=c; }
};
void main( )
{
Pointpoint1( 0,0,0);
point1.MovePoint(1,1,1);
}
MovePoint真正原型是void MovePoint( Point *this,int a, int b, int c){ this.x+=a; this.y+=b; this.z+=c; }。對象point1調用MovePoint(1,1,1)時,就把point1的地址傳給了this指針,調用point1.MovePoint(1,1,1)相當於point1.MovePoint (&point1,1,1,1 )
顯式使用this指針的場合:
this指針保留了成員函數所屬類的實例對象地址,形式上它通常是隱含的,編譯器編譯時會自動在引用成員變量的每個表達式中插入this指針。不過某些特殊場合也需要顯式使用它:
情況一:在類的非靜態成員函數中返回類對象本身時,需要用return*this。
情況二:當函數參數與成員變量同名,如:
class Date
{
int year, month, day;
public:
setYear(int year) { year=year }
……
};
setYear裏無法識別哪個year是類成員,哪個是參數。因此這裏就需要借用this指針:
setYear( int year) { this->year = year; }這樣就不會混淆了。
注意:
1. this指針僅作用於類的非靜態成員函數內部,靜態成員函數內沒有this指針。
2. this指針不是對象本身的一部分,不會影響sizeof(對象)結果。