nullptr关键字

发布时间 2023-12-04 17:09:25作者: Beasts777

文章参考:爱编程的大丙 (subingwen.cn)

C使用NULL表示空,其定义为:

#define NULL ((void *)0)

在C++中同样定义了NULL,C和C++虽然都是强类型语言,但是C++对语言的要求更高,不允许(void *)类型进行隐式的类型转化,因此如果沿袭C中NULL的定义,那么下述代码会出错:

int *p = NULL;

因此C++对NULL进行了新的定义:

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

也就是说,如果定义了__cplusplus宏,那么NULL就是0,否则就依旧是((void *)0),因此在C++中,NULL实际上就是0。

但是,如果令NULL==0,有时会产生二义性,例如如下代码:

#include <iostream>
using namespace std;

void func(void* i){cout << "func1" << endl;}
 
void func(int i){cout << "func2" << endl;}
 
void main(int argc,char* argv[])
{
	func(NULL);
	getchar();
}

这时会输出:func2。显然,二义性产生了。

为了解决这一问题,我们可以使用如下定义:

const class nullptr_t
{
public:
    template<class T>
    inline operator T*() const
        { return 0; }
 
    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
void operator&() const;
} nullptr = {};

而在C++11中,定义了nullptr,使用它来表示空指针。

总之,在C++中,如果要表示空指针,建议使用nullptr而不是NULL