C++ 新特性 | C++ 11 | nullptr 关键字

一、NULL 和 nullptr 的区别

1.1、C++ 11 引入 nullptr 的背景

NULL是一个宏,被定义为空指针,可以在stddef.h看到完整定义,如下:

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

C++11 引入了 nullptr 关键字,都用来表示空指针。为什么 C++11 要引入 nullptr 呢?先分析下使用NULL存在的问题,示例:

#include
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;
}

编译结果:

main.cpp: In function ‘int main():
main.cpp:16:14: error: call of overloaded ‘test(NULL)’ is ambiguous
     test(NULL);

上面的代码在编译时会存在问题,提示有二义性。上面的 C++ 程序:程序中重载了函数 test,可根据参数不同分别进行调用。但是存在一个问题,C语言是有隐式类型转换的,所以 NULL(这里实际上是 (void *)0 ) 可以隐式转换到 int 或 char * 。这就让程序很为难了,程序不知道选择调用哪个函数。而在 C 语言中,并不支持函数重载,故在纯 C 语言中不会有上面这个问题。

1.2、nullptr

在 stddef.h 中,nullptr 的定义如下:

#if defined(__cplusplus) && __cplusplus >= 201103L
#ifndef _GXX_NULLPTR_T
#define _GXX_NULLPTR_T
  typedef decltype(nullptr) nullptr_t;
#endif
#endif /* C++11.  */

C++11标准中,nullptr是一个所谓“指针空值类型”的常量,指针空值类型被命名为nullptr_t。可以看到,nullptr_t的定义方式非常有趣,与传统的先定义类型,再通过类型定义变量的做法完全相反(充分利用了decltype的功能)。

什么场景使用nullptr?

使用C++进行编程时,如果想表示空指针,那么使用nullptr,而不是NULL。

你可能感兴趣的:(C++,新特性,c++)