nullptr与NULL

栏目: C++ · 发布时间: 5年前

内容简介:在C语言中,我们使用注:因为在C语言中,是允许C++语言出现后,为了保持对C语言的兼容,保留了

C语言 中,我们使用 NULL 表示空指针,它实际上是一个宏,具体被定义为,

/* C 语言程序 */
#define NULL ((void*)0)
#define NULL 0 /* 两者皆可 */

注:因为在C语言中,是允许 void 指针隐式转换为其它类型指针的,所以 #define NULL ((void*)0) 这样的定义不会有问题。

C++语言出现后,为了保持对C语言的兼容,保留了 NULL ,但对 NULL 的定义变得更为严格,

/* C++ 语言程序 */
#ifdef __cplusplus
    #define NULL 0
#else
    #define NULL ((void*)0)
#endif

NULL 被定义为0,而不是 ((void*)0) ,因为在C++语言中, void 指针是不可以隐式转换为其它类型指针的,必须显示转换,

/* C++ 语言程序 */
#define NULL ((void*)0) /* 如果在 C++ 语言中这么定义的话 */

int* a = NULL; /* 隐式转换,错误 */
int* a = (int*)NULL; /* 显示转换,正确,但很麻烦,所以 NULL 都会被定义为 0 */

在C++ 98之前(包括C++ 98),在对 NULL 的使用上,都一直存在一个问题,假设有下面的代码,

/* C++ 语言程序 */
void func(int i);
void func(char* p);

func(NULL); /* 该调用哪个?*/

NULL 其实就是等于0,对于上面的两个函数,它都是符合的,如此,就会出现语义二义性的错误。

为了解决上述重载函数所带来的问题,C++ 11的 nullptr 应运而生。 nullptr 实质上是一个常量,实现代码大致如下,

/* C++ 语言程序 */
const /* 常量 */
class
{
public:
    template<class T>
    operator T*() const /* 向任意类型的非成员指针转换 */
    {
        return 0;
    }

    template<class C, class T>
    operator T C::*() const /* 向任意类型的成员指针转换 */
    {
        return 0;
    }

private:
    void operator&() const /* 不可取地址 */
    {
    }
} nullptr = {};

nullptr 只是一个常量,这就意味着我们可以在程序中随意定义一个与其名称相同的标识符,但因为 nullptr 在实际编程中的应用实在太广泛,因此C++编译器一般都会把 nullptr 定为关键字,避免 程序员 的滥用。

当然,C++ 11发布后,并没有因为 nullptr 的出现,而摒弃 NULL ,主要是为了兼容旧版程序。

最后,总结一下,

  1. 在C语言编程中,请使用 NULL 此时的 NULL ,要么是 ((void*)0) ,要么是0,对于C语言而言,都无所谓。
  2. 在C++语言编程中,请使用 nullptr 既为了避免以后出现bug,也为了养成一个良好的编程习惯。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图解Java多线程设计模式

图解Java多线程设计模式

[日] 结城浩 / 侯振龙、杨文轩 / 人民邮电出版社 / 2017-8 / 89.00元

本书通过具体的Java 程序,以浅显易懂的语言逐一说明了多线程和并发处理中常用的12 种设计模式。内容涉及线程的基础知识、线程的启动与终止、线程间的互斥处理与协作、线程的有效应用、线程的数量管理以及性能优化的注意事项等。此外,还介绍了一些多线程编程时容易出现的失误,以及多线程程序的阅读技巧等。在讲解过程中,不仅以图配文,理论结合实例,而且提供了运用模式解决具体问题的练习题和答案,帮助读者加深对多线......一起来看看 《图解Java多线程设计模式》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具