一、nullptr的引入
在C++98中,通常是用NULL或者0对指针变量进行初始化
int* p1 = NULL;
int* p2 = 0;
NULL其实一个宏,本质是0,在传统C头文件stddef.h中给可以看到如下代码
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL本质上其实是字面常量0或者无类型指针(void*)的常量,所以在使用NULL时会遇到一些麻烦:
对于如下的两个重载函数,func(NULL)本意是调用第二个函数,结果却是调用了第一个函数
void func(int x)
{
cout << "void func(int x)" << endl;
}
void func(int* x)
{
cout << "void func(int* x)" << endl;
}
int main()
{
func(0);
func(NULL);
return 0;
}
由此C++11中引入了关键字nullptr,可以使用nullptr来初始化指针变量,不会再发生上述问题
二、nullptr的细节
1.使用nullptr表示指针空值时,不需要包含头文件,因为nullptr时C++11作为新关键字引入的
2.在C++11中,sizeof(nullptr)与sizeof((void*)0)所占字节数相同
3.后续表示指针空值时,用nullptr替代NULL,提高代码的健壮性