首页 关于我们 成功案例 网络营销 电商设计 新闻中心 联系方式
QQ联系
电话联系
手机联系

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++中,表示空指针的方式经历了从 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; // 编译错误!不能赋值给整数

立即学习“C++免费学习笔记(深入)”;

为什么 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。不复杂但容易忽略。


# c++  # 区别  # 编译错误  # 隐式转换  # 为什么  # NULL  # 常量  # define  # 整型  # char  # int  # void  # 指针  # 重载函数  # 指针类型  # 整数类型  # 函数重载  # 空指针  # 是一个  # 是在  # 但在  # 推荐使用  # 而不  # 详细说明  # 作为一个  # 因为它  # 体现在