首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ nullptr 與 NULL 區別深度解析

     編輯:C++ 入門

nullptr vs NULL:為什麼 C++11 引入 nullptr?

NULL 的缺陷

C++ 中 NULL 通常定義為 0(整型),而非 (void*)0。導致重載決議、模板推導出錯:

void f(int); void f(void*);
f(NULL); // 調用 f(int),而非 f(void*)!

綁定函數指針時也會報錯:

void cb(void* data);
bind(cb, obj, NULL); // 錯誤:NULL 推導為 int,非 void*

nullptr 的優勢

  • 類型為 std::nullptr_t,可隱式轉換為任意指針類型、成員指針類型。
  • 不會參與整型重載決議,精確匹配指針參數。
  • 與 NULL 完全兼容的語義,但類型安全。

模擬實現(不支持 C++11 的編譯器)

const class nullptr_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

NULL vs null(其他語言)

  • C++:只有 NULL(宏)與 nullptr(關鍵字),無 null。
  • Java/C#:null 為關鍵字/字面量。
  • SQL:NULL 表示缺失值,IS NULL 判斷,ISNULL() 替換。
  • JavaScript:null 為原始值,undefined 為未定義。

最佳實踐

  1. C++11 及以上:全部使用 nullptr,禁用 NULL。
  2. 舊代碼庫:可用宏模擬 nullptr 或逐步替換。
  3. 模板代碼中傳遞空指針參數時,優先用 nullptr 避免推導為整型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved