在 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。