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表示空指针。

猜你喜欢

转载自www.cnblogs.com/w1ng/p/12960490.html
今日推荐