• 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

nullptr 是 C++11 引入的一个关键字,用于表示空指针常量。它是对传统 C 风格空指针(如 NULL0)的重大改进,解决了类型安全和重载歧义等问题。


一、为什么需要 nullptr

在 C++11 之前,通常用以下方式表示空指针:

int* p = 0;          // 整数 0 被隐式转换为指针
int* q = NULL;       // NULL 通常是 #define NULL 0

但这存在两个主要问题:

❌ 问题 1:类型不安全
void func(int);
void func(char*);

func(0);      // 调用 func(int)!不是 func(char*)!
func(NULL);   // 可能调用 func(int),取决于 NULL 的定义

意图是传空指针,结果调用了整数版本!

❌ 问题 2:模板推导失败
template<typename T>
void call(T ptr) {
    // ...
}

call(0);     // T 被推导为 int,不是指针类型!

二、nullptr 的优势 ✅

✅ 1. 类型安全
  • nullptr 的类型是 std::nullptr_t,可隐式转换为任何指针类型,但不能转换为整数
void func(int);
void func(char*);

func(nullptr);  // ✅ 正确调用 func(char*)
✅ 2. 清晰表达意图
int* p = nullptr;  // 明确表示“这是一个空指针”

0NULL 更具可读性。

✅ 3. 模板友好
template<typename T>
void call(T ptr) { /* ... */ }

call(nullptr);  // T 推导为 std::nullptr_t,行为明确
✅ 4. 支持重载决议
void f(int*);
void f(std::shared_ptr<int>);

f(nullptr);  // 可以正确匹配到 int* 版本(若无歧义)

三、nullptr 的特性

特性 说明
类型 std::nullptr_t(定义在 <cstddef>
可转换为 任意指针类型(包括成员指针)
不可转换为 整数、浮点数、bool(除非显式转换)
可比较 p == nullptrp != nullptr 安全有效
布尔值 在条件中为 false
if (p) { ... } else { /* p is nullptr */ }

四、使用示例

#include <iostream>
#include <memory>

void process(int* p) {
    if (p == nullptr) {
        std::cout << "Pointer is null\n";
    } else {
        std::cout << "Value: " << *p << "\n";
    }
}

int main() {
    int* raw_ptr = nullptr;
    std::unique_ptr<int> smart_ptr = nullptr;

    process(raw_ptr);        // 输出: Pointer is null
    process(nullptr);        // 直接传 nullptr

    if (!smart_ptr) {
        std::cout << "Smart pointer is empty\n"; // 会输出
    }

    return 0;
}

五、与 NULL0 的对比

写法 类型 是否推荐 原因
0 int ❌ 不推荐 类型错误,易引发重载歧义
NULL 通常是 int(如 #define NULL 0 ❌ 不推荐 本质还是整数,非类型安全
nullptr std::nullptr_t 强烈推荐 类型安全、语义清晰、C++ 标准化

📌 Google C++ Style Guide、C++ Core Guidelines 等均要求:始终使用 nullptr 表示空指针。


六、注意事项

  1. 不要将 nullptr 赋值给非指针类型

    int n = nullptr;  // ❌ 编译错误(C++11 起禁止)
    
  2. delete nullptr 是安全的

    int* p = nullptr;
    delete p;         // ✅ 合法,无操作(no-op)
    
  3. 与智能指针兼容

    std::shared_ptr<int> sp = nullptr;  // 合法
    if (sp == nullptr) { ... }          // 合法
    

七、总结

在 C++11 及以后,永远使用 nullptr 表示空指针!

它:

  • 消除了 0/NULL 的类型安全隐患
  • 提高了代码可读性和健壮性
  • 是现代 C++ 的标准实践

记住口诀:

指针为空用 nullptr,告别 NULL0

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐