算是为了与C语言进行兼容而定义的一个问题吧
NULL来自C语言,一般由宏定义实现,而 nullptr 则是C++11的新增关键字。在C语言中,NULL被定义
为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
意思就是说当我们使用g++编译器的时候,NULL就被宏定义为整型数0,若是gcc编译器,NULL则被宏定义为(void*)0。那么为什么在C++和C中不一样呢?因为C++中不能将void *类型的指针隐式转换成其他指针类型。在C++中指针必须有明确的类型定义。但是将NULL定义为0带来的另一个问题是无法与整数的0区分。因为C++中允许有函数重载,所以可以试想如下函数定义情况:
#include<iostream>
using namespace std;
void fun(char* p)
{
cout << "char* " << endl;
}
void fun(int p)
{
cout << "int " << endl;
}
int main()
{
fun(NULL);
return 0;
}
输出结果:
因此我们就可以知道在传入NULL参数时,会把NULL当做整数0来看,如果我们想调用参数是指针的函数,该怎么办呢?。nullptr在C++11被引入用于解决这一问题,nullptr可以明确区分整型和指针类型,能够根据环境自动转换成相应的指针类型,但不会被转换为任何整型,所以不会造成参数传递错误。
如下 改为 nullptr:
#include<iostream>
using namespace std;
void fun(char* p)
{
cout << "char* " << endl;
}
void fun(int p)
{
cout << "int " << endl;
}
int main()
{
fun(nullptr);
return 0;
}
结果相应变为: