在 C++ 中,NULL
和 nullptr
都表示空指针,但它们有一些关键的区别。nullptr
是 C++11 引入的,目的是解决 NULL
存在的一些问题。
NULL
和 nullptr
的区别
1. 类型
-
NULL
: 通常被定义为0
或((void*)0)
,具体定义取决于编译器和标准库实现。在 C++ 中,NULL
实际上是一个整数常量0
。#define NULL 0 // 一种常见的定义方式
-
nullptr
: 是 C++11 引入的关键字,专门表示空指针。它有明确的类型std::nullptr_t
。std::nullptr_t ptr = nullptr;
2. 类型安全
-
NULL
: 由于NULL
实际上是整数0
,在函数重载和模板中可能会引发歧义。例如,在函数重载时,如果有接受整数和指针的重载,传递NULL
可能导致编译器选择错误的重载。void foo(int); void foo(char*); foo(NULL); // 不明确,是调用 foo(int) 还是 foo(char*)?
-
nullptr
: 由于nullptr
是专门的空指针类型,它不会引发这种歧义。void foo(int); void foo(char*); foo(nullptr); // 明确调用 foo(char*)
3. 可读性和意图表达
NULL
: 由于NULL
是整数0
,有时可能不太直观,不能明确表达指针语义。nullptr
: 直接表示空指针,语义明确,提高代码的可读性和维护性。
为什么要引入 nullptr
1. 消除歧义
如上所述,nullptr
消除了 NULL
作为整数 0
带来的重载歧义,特别是在模板和函数重载中。
2. 提高类型安全性
nullptr
是一个实际的类型 std::nullptr_t
,可以避免许多类型转换错误和不明确性,增强了类型安全性。
3. 更好的表达空指针语义
nullptr
语义明确,代码可读性更好,开发者可以清晰地表达指针为空的意图。
示例对比
使用 NULL
void func(int);
void func(char*);
int main() {
func(NULL); // 可能会产生歧义,不知道调用 func(int) 还是 func(char*)
return 0;
}
使用 nullptr
void func(int);
void func(char*);
int main() {
func(nullptr); // 明确调用 func(char*)
return 0;
}
总结
nullptr
是 C++11 引入的关键字,专门用于表示空指针,解决了 NULL
存在的类型歧义和类型不安全问题。它提高了代码的可读性和维护性,确保开发者可以明确地表达指针为空的意图。因此,在现代 C++ 编程中,建议优先使用 nullptr
而不是 NULL
。