今天翻阅c++primer时,书中明确表示推荐用nullptr去表示空指针而不是NULL和0。
int *p1=nullptr;
int *p1=0;
int *p1=NULL;
这时有点好奇这三种表示方式有什么区别吗?下面一探究竟:
0在c++中表示就是整数0,这个所有人都清楚。但是NULL大部分对它有误解,或许你看到int *p1=NULL;这个语句你自然而然地就会知道p1是一个空指针,而且你可能下意识地的认为NULL就是表示空指针的意思,因为在别的地方也没见过用它,就是在表示空指针的时候见过。
其实NULL是一个宏,在c中表示:
#define NULL ((void *)0)
确实在c中NULL表示是空指针,在c中int *p1=NULL;这个语句是没有问题的,因为c是弱类型语言,void类型指针可以隐形转换成其他类型指针。
在c++中表示是:
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
因为c++是强类型语言,对指针类型的隐形转换是不允许的,所以在c++中的宏定义中我们就可以看出来,NULL就是整数0。因此NULL就是0,在c++中这两个语句是一样。
int *p1=0;
int *p1=NULL;
在c++11标准之前,表示空指针使用NULL和0,这两种表示方式均存在缺陷。具体表示在函数重载时,
int func (int a,int b);
int func (int a,int*b);
这里是一个简单的函数重载,下面我们进行测试发现,func(10,NULL),func(10,0)这两个都是调用的 int func(int a,int b)函数,NULL表示不是空指针而是0。
func(10,NULL);
func(10,0);
func(10,nullptr);
所以,为了避免0的二义性,要养成用nullptr关键字表示空指针的习惯。