在C++11的标准中加了一个用来表示空指针的常量值——nullptr
。由于我对nullptr
的理解不够,这让我在表示空指针的时候就犯了选择困难症了。
我对C语言比较熟悉,在C中表示空指针的宏NULL
是这样定义的:
#define NULL ((void *)0)
这样就可以表示空指针的,但是在C++中这个宏是不可以的,因为C++的类型检查比C更严格,不允许把void *
类型的指针赋给指针变量,因此在C++中宏NULL
是这样定义的:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
显然,在C++中NULL
的值和0
是等价的。然而这就引发了一个严重的重载问题,例如下面两个函数:
void fun(int a, int *b);
void fun(int a, int b);
如果我问程序中有如下调用:
int a = 0;
fun(a,NULL);
可以看出我们想调用的是:void fun(int a, int *b);
但实际上我们调用的是第二个函数。
而C++11中添加的nullptr
就可以解决这个重载问题,减少很多不必要的BUG,编译环境允许的话,还是多多使用nullptr
吧。