1. 程式人生 > >空指標可以呼叫成員函式?

空指標可以呼叫成員函式?

有下面一個簡單類:

class A
{
public:
    void fun(){
        cout << "I'm class A"<<endl;
    }
};

用一個空指標呼叫上面的fun函式:

A* pa = NULL;
pa->fun();

講道理,空指標應當是”不可用”的,自然也不能呼叫其成員函數了,但是結果卻出乎意料地正確執行了:
這裡寫圖片描述

為什麼??其實,關鍵在於每個成員函式的this指標。
其實,c++類的成員函式與傳統c的函式並沒有什麼不同,只是成員函式的第1個引數必須是this指標,只是這個引數是由編譯器自動加上去的,呼叫時也不需要顯示傳遞。

所以,上面的class A的成員函式fun的本質其實是這樣子的:

void fun(A* this){
        cout << "I'm class A"<<endl;
    }

而呼叫是其實這樣子的:

A* pa = NULL;
fun(pa);

可以看到,雖然this指標實參為NULL,但是fun函式根本沒有用到this指標啊,this在這裡只是打了個醬油而已!

但是,如果在成員函式中使用的成員變數,就不可避免要使用到this指標,若是這樣,就不可避免的出現崩潰了。

綜上所述:即便物件指標為NULL,只要成員函式沒有使用非靜態成員函式,就可以正常呼叫該成員函式。