nullptr
为什么引入nullptr
在C++98/03标准中, 将一个指针初始化为空指针
- int *ptr = 0;
- int *p = NULL
NULL并不是C++的关键字, 它是C++定义的宏,并且字面量为0.(#defeine NULL 0)
看例子:
代码
#include <iostream>
class Test {
public:
void isNull(void *p) {
std::cout << "void *p" << std::endl;
}
void isNull(long n) {
std::cout << "long n" << std::endl;
}
};
int main() {
Test* t = new Test();
t->isNull(NULL);
t->isNull(nullptr);
return 0;
}
输出:
long n
void *p
分析:
- 对于isNull(NULL)来说, 显然它真正调用的是参数为long的isNull()函数; 而对于isNull(null), 期望的是调用参数为void *p的isNull()函数. 根据执行结果, 并不符合预期
nullptr
nullptr是nullptr_t类型的右值常量, 专用于初始化空类型指针. nullptr_t是C++11新增数据类型, 可称为"空指针".
上述代码执行第二行结果可以分析出, nullptr无法隐式转换为long, 而可以隐式匹配指针类型. 执行结果符合预期