char* c = NULL;
C:NULL
表示空指针,NULL
可以被定义为 ((void*)0)
或是0
。
C++不允许将void*
隐式转换为其他类型的指针,这样定义:
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
提出问题:
函数重载无法区分代码的语义。
void foo(char *); void foo(int); void foo(nullptr_t);
foo(NULL)
将会调用foo(int)
。
解决方案:
C++ 11引入关键字来代表指针常量:nullptr
,将空指针和整数0区分开。 nullptr
的类型为 nullptr_t
,能隐式转换为任何指针或是成员指针的类型,也能和它们进行相等或不等的比较。而nullptr
不能隐式转换为整数,也不能和整数做比较。
char* pc = nullptr; // OK int * pi = nullptr; // OK int i = nullptr; // error bool b = nullptr; // OK foo(pc); // 调用foo(char *), 而不是 foo(int); foo(nullptr); // 调用foo(nullptr_t);
在C++11的标准类型头文件中,nullptr_t
类型应该被声明为:
typedef decltype(nullptr) nullptr_t;
总结:
使用nullptr
表示空指针。