1. 程式人生 > >20. A *p=NULL,p 可以呼叫 A 類裡面的函式嘛?

20. A *p=NULL,p 可以呼叫 A 類裡面的函式嘛?

我們來觀察一下:

#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的存在?

    “皮之不存,毛將焉附?”