20. A *p=NULL,p 可以呼叫 A 類裡面的函式嘛?
阿新 • • 發佈:2018-12-13
我們來觀察一下:
#include<iostream> class A { public: A() { a = 5; } int a; void sum() { int b = 10; } }; int main() { A *pa = NULL; pa->sum();//問題這裡,奇怪了為什麼指標並沒有new A,也就是說沒有初始化,但是還可以執行函式sum()呢? (就是說怎麼還能找得到sun()函式的地址呢?) int aa = pa->a;//這個時候會出錯誤 找不到pa->a,這個是可以理解的。 system("pause"); return 0; }
問題:
1)為什麼指標並沒有new A,也就是說沒有初始化,但是還可以執行函式sum()呢? (就是說怎麼還能找得到sun()函式的地址呢?)
這裡問題很簡單,因為函式在類裡面是獨立於類存在的,而且不佔用類的空間,在程式編譯的時候就已經把函式的地址分配好了,因此只要有這麼一個物件,不管他指向NULL還是
非NULL都是可以呼叫函式的,也不會出錯。因此
pa->sum()可以執行;
2)int aa = pa->a; // 為什麼這個時候會出錯誤 找不到pa->a?。
但是這裡就有問題了,pa就是NULL了,沒有空間了,但是a是類的一個成員,沒有空間的物件會有
內部的a的存在?
“皮之不存,毛將焉附?”