nullptr和NULL 區別


 注:本文內容摘自網絡,准確性有待驗證,現階段僅供學習參考。尊重作品作者成果,原文鏈接 :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  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM