c++ nullptr和NULL区别 c++11空指针详解

C++11引入nullptr替代NULL以解决类型安全问题。1. NULL是整型常量0,易在函数重载时引发歧义;2. nullptr是专用空指针类型std::nullptr_t,只匹配指针参数;3. 使用func(nullptr)可准确调用指针版本函数;4. 现代C++推荐统一使用nullptr,避免NULL或0表示空指针,确保类型推导正确,提升代码可靠性。

在C++中,表示空指针的方式经历了从 NULLnullptr 的演变。特别是在C++11引入 nullptr 后,它逐渐成为推荐的空指针表示方式。下面详细说明它们的区别和使用场景。

NULL 是什么?

在传统C和C++中,NULL 通常被定义为整数0或(void*)0(在C中),但在C++中一般定义为字面量0。例如:

#define NULL 0

这意味着 NULL 实际上是一个整型常量,而不是一个专门的空指针类型。这会引发一些类型安全问题,尤其是在函数重载时。

nullptr 是什么?

C++11 引入了 nullptr 作为一个类型安全的空指针常量。它的类型是 std::nullptr_t,可以隐式转换为任何指针类型,但不会与整数类型混淆。

例如:

int* p = nullptr; // 正确
char* q = nullptr; // 正确
int i = nullptr; // 编译错误!不能赋值给整数

为什么 nullptr 更好?

主要优势体现在类型推导和函数重载解析上。

例子:函数重载中的歧义

假设有以下两个重载函数:

void func(int);
void func(char*);

如果调用:

func(NULL);

由于 NULL 就是 0(整数),编译器会选择 func(int),这可能不是你想要的结果——你本意可能是传一个空指针。

而使用:

func(nullptr);

编译器会明确选择 func(char*),因为 nullptr 只能匹配指针类型,消除了歧义。

实际使用建议

在现代C++(C++11及以上)中:
  • 优先使用 nullptr 表示空指针
  • 避免使用 NULL,因为它本质是整数,可能导致类型误判
  • 不要用 0 直接表示空指针,同样有类型不明确的问题
  • 模板编程中尤其推荐使用 nullptr,保证类型推导正确

基本上就这些。nullptr 的引入解决了长期存在的空指针类型不安全问题,让代码更清晰、更可靠。虽然 NULL 在旧代码中仍常见,但新项目应统一使用 nullptr。不复杂但容易忽略。