C++中为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:
如下:
int *p1 = NULL; // 需要引入cstdlib头文件 int *p2 = 0; int *p3 = nullptr;
为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?
1.NULL在C++中的定义,NULL在C++中被明确定义为整数0:
/* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else /* __cplusplus */ #define NULL ((void *)0) #endif /* __cplusplus */ #endif /* NULL */
那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。
简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。考虑下面这段代码:
void Func(char *); void Func(int); int main() { Func(NULL); }
如果C++让NULL也支持void *的隐式类型转换,这样编译器就不知道应该调用哪一个函数。
void Func(char *); void Func(int); int main() { Func(NULL); // 调用Func(int) }
由于我们经常使用NULL表示空指针,所以从程序员的角度来看,Func(NULL)应该调用的是Func(char *)但实际上NULL的值是0,所以调用了Func(int)。nullptr关键字真是为了解决这个问题而引入的。
另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。
char *p1 = nullptr; // 正确 int *p2 = nullptr; // 正确 bool b = nullptr; // 正确. if(b)判断为false
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215189.html原文链接:https://javaforall.net
