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
。