C++11——空指针
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
表示空指针。