在C++11及其后续版本中,NULL 和 nullptr 都是用来表示空指针的。但是它们有些许的区别:
- NULL 是一个宏定义,通常被定义为0或者(void*)0。在C++11之前,NULL 被广泛用于指针值的初始化或比较操作。
- nullptr 是一个关键字(keyword),是C++11引入的新特性。这个关键字的作用就是表示空指针,严格说 nullptr 不是一个整数类型也不是一个浮点数类型。
- 两者的区别在于 nullptr 是类型安全的,而 NULL 不是。
在某些情况下,使用 NULL 可能会导致编译器警告或错误。例如,在某些函数重载的情况下,使用 NULL 可能会导致函数调用的二义性。
使用 nullptr 可以避免这种二义性,同时也能提高代码的可读性和可维护性。因此在C++11及其后续版本中,建议使用 nullptr 来代替 NULL。
以下是一个示例程序,展示了使用 NULL 和 nullptr 的区别:
#include <iostream>
using namespace std;
void func(char* ptr) {
cout << "Char pointer version\n";
}
void func(int ptr) {
cout << "int version\n";
}
int main() {
func(NULL); // 无法通过编译,可能导致二义性
func(nullptr); // 仅调用char*版本
return 0;
}
「总结」:NULL 在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了 nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议在新的代码中应该尽可能使用 nullptr 来表示空指针,而避免使用已经过时的 NULL 宏定义。