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

在C++中,表示空指针的方式经历了从 NULL 到 nullptr 的演变。特别是在C++11引入 nullptr 后,它逐渐成为推荐的空指针表示方式。下面详细说明它们的区别和使用场景。
NULL 是什么?
在传统C和C++中,NULL 通常被定义为整数0或(void*)0(在C中),但在C++中一般定义为字面量0。例如:#define NULL 0
nullptr 是什么?
C++11 引入了 nullptr 作为一个类型安全的空指针常量。它的类型是 std::nullptr_t,可以隐式转换为任何指针类型,但不会与整数类型混淆。例如:
int* p = nullptr; // 正确char* q = nullptr; // 正确int i = nullptr; // 编译错误!不能赋值给整数
立即学习“C++免费学习笔记(深入)”;
为什么 nullptr 更好?
主要优势体现在类型推导和函数重载解析上。例子:函数重载中的歧义
假设有以下两个重载函数:
void func(int);void func(char*);
如果调用:
func(NULL);
func(int),这可能不是你想要的结果——你本意可能是传一个空指针。而使用:
func(nullptr);
func(char*),因为 nullptr 只能匹配指针类型,消除了歧义。实际使用建议
在现代C++(C++11及以上)中:- 优先使用 nullptr 表示空指针
- 避免使用 NULL,因为它本质是整数,可能导致类型误判
- 不要用 0 直接表示空指针,同样有类型不明确的问题
- 模板编程中尤其推荐使用 nullptr,保证类型推导正确
基本上就这些。nullptr 的引入解决了长期存在的空指针类型不安全问题,让代码更清晰、更可靠。虽然 NULL 在旧代码中仍常见,但新项目应统一使用 nullptr。不复杂但容易忽略。











