美文网首页
C++中NULL和nullptr的区别

C++中NULL和nullptr的区别

作者: PengQ1 | 来源:发表于2020-03-01 03:11 被阅读0次

前言

C和C++的变量名是对大小写敏感的,因此NULL和null并不是一回事,前者是C/C++中的系统关键字,null并不是。C++11以后又引入了nullptr,用以解决NULL在隐式转换和作为函数传入参数时的二义性问题。

在C++11以前,在C/C++语言中,我们常常用NULL作为指针变量的初始值。而在C++11之后,却不建议你这么做。
其实NULL根据命名全大写可以看出来,它是一个常量,既然是常量,就需要进行宏定义。C语言的标准头文件是这样定义的

 #define NULL ((void*)0)

而到了C++中,则变成了

#define NULL 0

查阅stddef.h,可以看到如下定义

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

从定义中可以看出,C++中,NULL其实就是0,但是也可以用作空指针,只是用作空指针可能是为了兼容C,迫于无奈。
以下一段代码可以很好地解释NULL存在的问题:

#include<iostream>
using namespace std;
void test(void *p)
{
    cout<<"p is pointer "<<p<<endl;
 }
void test(int num)
{
    cout<<"num is int "<<num<<endl; 
}
int main(void)
{
    test(NULL);
    return 0; 
}

这时,如果编译的话,会报以下错误,

$ g++ -o test test.cpp
    main.cpp: In function ‘int main()’:
    main.cpp:14:14: error: call of overloaded ‘test(NULL)’ is ambiguous
         test(NULL);

很明显,NULL存在二义性,它既是整数,也是一个指针,函数test()无法根据参数的数据类型判断应该调用哪一个实现。
这时使用nullptr的优越性就体现出来了,因为它可以很好地把空指针这一层意思给剥离出来。nullptr就是C++11为了解决这个痛点而推出的东西。

    test(nullptr);

就会自然而然地走到指针的那个函数里。因此,以后若想使用整数特性,就赋值为0,若想使用指针特性,就赋值为nullptr,这样一目了然,减少了未知的Bug的可能性。
多说一句,为什么要作此改动,我想首先应该是C和C++在处理void 类型的时候存在一定的区别。C语言中,void 类型的变量可以赋值给任意类型的指针,也可以被任意类型的指针赋值,两个方向都不会报错。但是C++具有更严格的类型检查,前者是不被允许的。
因此下面一段C语言代码是可以编译通过的

int main()
{
    void* a;
    int* b=a;
}

但是下面的C++代码就会报错

test.cpp:4:7: error: cannot initialize a variable of type 'int *' with an lvalue of type 'void *'
int* b=a;

与此同时,在malloc上,也存在类似的问题:

int len = 100;
int p = malloc(len * sizeof(int)); // C推荐做法
int p = (int )malloc(len * sizeof(int)); // C++推荐做法

malloc函数返回值得类型是 void*,C不要求强制类型转换,会自动进行隐式转换,但是C++则需要,因为void* 不能转换成其他类型的指针。

相关文章

  • FFmpeg视频播放

    首先记录一下C++中的NULL、0、nullptr的区别 NULL在C++中就是0,这是因为在C++中void* ...

  • C++中NULL和nullptr的区别

    前言 C和C++的变量名是对大小写敏感的,因此NULL和null并不是一回事,前者是C/C++中的系统关键字,nu...

  • C++学习笔记之NULL vs nullptr

    C++学习笔记之NULL vs nullptr

  • C++11/14新特性

    1.nullptr nullptr 出现的目的是为了替代 NULL,传统 C++ 会把 NULL、0 视为同一种东...

  • NULL 和nullptr区别

    今天在写一个程序的时候,想设置默认参数。其实自己想的和这个似乎一点关系都没有。 不过不重要。重点是了解了一些东西。...

  • C++11新特性(2)

    1.空指针nullptr nullptr与NULL的区别:对于NULL,是一个空指针常量,如果将NULL扩展为常数...

  • 2019-01-08

    c++11中nullptr(与NULL的区别)[https://blog.csdn.net/justdoithai...

  • nullptr(转)

    引入nullptr的原因引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NUL...

  • C++ 理解NULL和nullptr

    考虑以下代码简单的代码,向my函数传递NULL会发生什么问题? 编译无法通过,这里发生什么问题呢?NULL在C中实...

  • nullptr与NULL的区别

    为什么建议你用nullptr而不是NULLhttps://zhuanlan.zhihu.com/p/7988396...

网友评论

      本文标题:C++中NULL和nullptr的区别

      本文链接:https://www.haomeiwen.com/subject/xeczhhtx.html