C++11:nullptr、NULL、0之间的区别
C++11:nullptr、NULL、0之间的区别
C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages -- C++成为C++语言新标准。
C++11是对目前C++语言的扩展和修正, C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL) ,并入了大部分的C++ Technical Report 1(TR1) 程序库(数学的特殊函数除外)。
C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、 decltype,和模板的大量改进。
先看NULL的定义
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#define NULL 01234
c语言中将NULL定义为空指针,而在c++中直接定义为0,这是因为C++是强类型的,void *是不能隐式转换成其他指针类型的。
既然NULL被定义成0,就存在二义性
c++ 中我们写这样一个函数 1
test(classA a,classB *pb);//函数1
我们可以这样调用
test(a,NULL);
没有问题,但是当我们重载这个函数2后,在做同样的调用
test(classA a,classB *pb);//函数1
test(classA a,int i);//函数2
test(a,NULL);//调用的是函数2
这个时候我们本来期望调用函数1,但是实际情况是调用了函数2。这就是NULL在C++中的二义性问题。c11提供了nullptr来解决这个问题,nullptr是一个关键字,表示一个空指针。
test(a,nullptr);//调用的是函数1
nulllptr_t为nullptr的类型
#if __cplusplus >= 201103L
typedef decltype(nullptr) nullptr_t;
#endif
由nullptr_t定义的任何变量都具有nullptr一样的行为,即nullptr_t类似于一种数据类型。
永远相信美好的事情即将发生。

浙公网安备 33010602011771号