null 指標為什麼能調用成員函數?

來源:互聯網
上載者:User

發現了一個null 指標調用函數成功的例子,很奇怪就查了一下資料,如下:

舉個簡單的例子,假如有如下的一段代碼:

class MyClass{public:    int i;    void hello()    {        printf("hello\n");    }    void print()    {        printf("%d\n", i);    }};void main(){    MyClass* pmy = NULL;    pmy->hello(); }

看上面的這段代碼,似乎很詭異。 用一個null 指標調用成員函數,簡直是天大的錯誤,可以遺憾的是,卻是可行的,至少對於上面的這段程式來說,不會照成錯誤。
為什嗎?
    其實,這並不是十分神秘的問題,假如你曾經使用過C封裝結構的話,對於這個問題,是十分好理解的。
    在類初始化的時候,編譯器會將它的函數分配到類的外部,當然這也包括靜態成員函數,這樣的做法,主要是為了節約記憶體,這也是為什麼靜態函數可以在對象初始化之前啟動並執行原因。
    大家知道,每個對象,都有一個指向自己的this指標,這個指標的值,將會因為對象的不同而不同,它的作用主要就是用來區分不同的對象,這樣你就可以根據它來訪問不同的對象的成員變數。

    編譯器編譯後的成員函數的第一個參數是this指標,通過this指標引用資料成員及調用其它成員函數。

    我們main函數中的hello函數並沒有使用類中的任何成員變數,所以,它也就不會用到this指標,此時的this指標是NULL。由於你調用的成員函數沒有使用到類的資料成員,所以即使傳入的this指標為空白,從而我們就可以沒有障礙的使用hello函數,然而相對的是,如果你在pmy->hello()之後接著調用pmy->print(),那麼將會報null 指標錯誤,因為這個函數試圖用this指標訪問成員變數i。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.