在 C++11 中引入了新的关键字 nullptr
,用于表示空指针常量。相比于旧标准中使用的宏定义 NULL
,nullptr
具有以下优点:
-
类型更加明确:
nullptr
的类型是std::nullptr_t
,是一个与所有指针类型不兼容的类型,这意味着nullptr
可以和函数重载等机制一起使用,避免了类型歧义的问题。 -
函数重载的歧义:在旧标准中,
NULL
有时候被定义为 0 或 ((void*)0),会带来一些问题,例如在重载函数时无法区分空指针与整型0,因此C++11中建议使用nullptr
。 -
隐式类型转换带来的隐患:在某些情况下,
NULL
可能被隐式转换为其他类型,从而引发一些意外的错误,而nullptr
不会发生隐式转换,避免了一些潜在的问题。
示例
如下是函数重载的歧义示例
#include<iostream>
using namespace std;
void fun(int x)
{
cout << "fun(int)" << endl;
}
void fun(char* s)
{
cout << "fun(char*)" << endl;
}
void test()
{
fun(NULL);
fun(0);
fun(nullptr);
}
int main()
{
test();
return 0;
}
以下是隐式类型转换带来的隐患,该隐患针对不同的编译器可能会带来不同的结果
void test()
{
void* p=nullptr;
double a=3.14;
p=&a;
int *p1=(int*)p;
std::cout<<*p1<<std::endl;
}