c++ nullptr和NULL区别 c++11空指针详解
发布时间:2026-01-06 00:00
发布者:裘德小鎮的故事
浏览次数: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。不复杂但容易忽略。
# c++
# 区别
# 编译错误
# 隐式转换
# 为什么
# NULL
# 常量
# define
# 整型
# char
# int
# void
# 指针
# 重载函数
# 指针类型
# 整数类型
# 函数重载
# 空指针
# 是一个
# 是在
# 但在
# 推荐使用
# 而不
# 详细说明
# 作为一个
# 因为它
# 体现在





推导正确,提升代码可靠性。