C++中的NULL和nullptr
在C++中,NULL和nullptr都用于表示空指针,但它们有一些重要的区别。
类型
-
NULL:NULL是一个宏定义,通常被定义为整数0。它被视为整数类型,并且可以隐式转换为指针类型。
C++中NULL的定义形式 #ifndef NULL #ifdef __cplusplus // __cplusplus是C++自动添加的宏,C++文件都有 #define NULL 0 //在C++中NULL被定义为 int{0} #else #define NULL ((void *)0) //为了兼容c,把0转换为void* 类型 #endif #endif
-
nullptr:nullptr是一个关键字,是一个特定的空指针常量,它的类型是nullptr_t,可以隐式转换为任何指针类型。
安全性
-
使用**
NULL
**可能会导致意外的类型转换和错误,因为它实际上是整数0,可能与整数类型发生混淆。 -
nullptr提供更好的类型安全性,因为它是一个明确定义的空指针常量,不会与其他类型发生混淆。
考虑如下代码:
#include <iostream> void foo(int p) { std::cout << "int p" << std::endl; } void foo(char* p) { std::cout << "char* p" << std::endl; } int main() { foo(NULL); // 调用 foo(int*),可能导致意外的类型转换 foo(nullptr); // 调用 foo(const char*),类型更明确 return 0; }
按照常规理解
NULL
是一个指针,那么两个重载的foo
函数的输出都应该是char* p"
,但是实际输出如下
可见NULL
调用的是void foo(int p)
函数;
但是为什么在平常int* a=NULL
却能够正常运行呢?因为发生了隐式转换,转换为了void*
上下文
- 在C++11及更高版本中,推荐使用nullptr来表示空指针。
- nullptr是一种更现代、更安全的表示空指针的方式,并且在许多情况下可以替代NULL。