關於指向空的物件指標可以訪問類的不包含成員變數的成員函式的原因
阿新 • • 發佈:2019-01-22
#include <iostream>
using namespace std;
class A {
int a;
int b;
public:
void print(){
cout << "abcd";
}
void print_a(){
cout << a << endl;
}
};
int main(void) {
A *a = NULL;
a->print(); //可以執行
a->print_a();//出現段錯誤
return 0;
}
暫時理解為以下:
可以參考python的方法來進行理解:
python 定義一個成員函式的方法為:print(self)
而通過物件呼叫該函式的時候通過a.print()來呼叫。也就是將物件a傳入到print的self引數中。
再轉回來:
c++中,每個物件都擁有一份獨立的成員變數空間。而對於成員函式,並不是每個物件都擁有一份成員函式體而是所有的物件共用一份成員函式,程式編譯之後,成員函式的地址就已經確定。成員函式的非虛擬函式由呼叫該函式的物件型別或者指標型別決定呼叫基類還是子類的函式塊,然後直接進行呼叫,如果該函式用到了物件的成員變數,那麼當遇到該變數時,將該變數自動轉換為this->變數。
這是整個呼叫過程。
那麼對於上述問題,指向空的物件指標,是可以呼叫該類的非靜態且不包含成員變數的函式(不需要this指標)。然而當遇到成員變數後,呼叫該物件的this指標,為空,會出現段錯誤。
暫時做一下筆記,發現一篇部落格比我這個解釋清楚多了,介紹給大家:http://blog.csdn.net/starlee/article/details/2062586