C++11 指针空类型 - nullptr

Posted Overboom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11 指针空类型 - nullptr相关的知识,希望对你有一定的参考价值。

0. 引言

熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:

如下:

int *p1 = NULL; // 需要引入cstdlib头文件
int *p2 = 0;
int *p3 = nullptr;

新标准中建议使用nullptr代替NULL来声明空指针。到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?

1. C/C++中的NULL到底是什么

我们查看一下C和C++的源码,不难发现:
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 */

2.NULL在C中的定义.在C中,NULL通常被定义为如下:

#define NULL    ((void *)0)

也就是说NULL实质上是一个void *指针。

1.1 C++的NULL为什么不兼容C的NULL

我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?

简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。考虑下面这段代码:

void Func(char *);
void Func(int *);

int main()
{
    Func(NULL);
}

如果C++让NULL也支持void *的隐式类型转换,这样编译器就不知道应该调用哪一个函数。

2. 为什么要引入nullptr

C++ 中将 NULL 定义为字面常量 0,并不能保证在所有场景下都能很好的工作,比如,函数重载时,NULL 和 0 无法区分:

void Func(char *);
void Func(int *);

int main()
{
    Func(NULL);
}

由于我们经常使用NULL表示空指针,所以从程序员的角度来看,Func(NULL)应该调用的是Func(char *)但实际上NULL的值是0,所以调用了Func(int)。nullptr关键字真是为了解决这个问题而引入的。

另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字

3. nullptr使用

nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。



char *p1 = nullptr;     // 正确
int  *p2 = nullptr;     // 正确
bool b = nullptr;       // 正确. if(b)判断为false
int a = nullptr;        // error

以上是关于C++11 指针空类型 - nullptr的主要内容,如果未能解决你的问题,请参考以下文章

C++11 nullptr:初始化空指针

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

C++11之空指针-nullptr

C++11新特性:24—— C++11 nullptr:初始化空指针