注:本文內容摘自網絡,准確性有待驗證,現階段僅供學習參考。尊重作品作者成果,原文鏈接 :http://www.2cto.com/kf/201302/190008.html
1、
為什要有nullptr
我們給一個指針賦初值的時候一般這么寫 FILE* fp = NULL;
這里有個NULL的定義,一般情況下它是這么定義的:
[cpp] #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif
在
c語言環境下,由於不存在函數重載等問題,直接將NULL定義為一個void*的指針就可以完美的解決一切問題。
但是在c++環境下情況就變得復雜起來, 首先我們不能寫這樣的代碼 FILE* fp = (void*)0; 將void*直接賦值給一個指針是不合法的,編譯器會報錯。 我們只能這樣寫代碼
[cpp] FILE* fp = (FILE*)0; // or FILE* fp = 0;
所以在c++下面,NULL就被直接定義為一個整型 0。 在大多數情況下這並不會產生什么問題,但是萬一有重載或者模板推導的時候,編譯器就無法給出正確結果了。比如下面的情形:
[cpp] void call_back_process(CCObject* target, void* data); bind(call_back_process, target, NULL); // error 函數類型是void* ,但是我們綁定的是一個整型 0
2、
nullptr的應用場景:
如果我們的編譯器是支持nullptr的話,那么我們應該直接使用nullptr來替代NULL的宏定義。正常使用過程中他們是完全等價的。
3、模擬nullptr的實現:
某些編譯器不支持c++11的新關鍵字nullptr,我們也可以模擬實現一個nullptr
[cpp] www.2cto.com const class nullptr_t_t { public: template<class T> operator T*() const {return 0;} template<class C, class T> operator T C::*() const { return 0; } private: void operator& () const; } nullptr_t = {}; #undef NULL #define NULL nullptr_t