程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 討論nullptr和NULL

討論nullptr和NULL

編輯:C++入門知識

最近玩了兩天的c++11,其中有一個是新的關鍵字nullptr。 這裡討論下nullptr的存在價值,應用場景以及不支持c++11的時候如何模擬nullptr。   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    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved