现代C++应该使用nullptr,而不是NULL
Contact me
- Blog -> https://cugtyt.github.io/blog/index
- Email -> cugtyt@qq.com
- GitHub -> Cugtyt@GitHub
在C++11以前我们一般用NULL来代表空指针,C语言也是一样,最本质的问题是NULL究竟是什么?
这里用VS2017,看下NULL的定义:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可见NULL就是0,这又什么问题呢,就是在C++里面如果遇上函数重载:
void fun(int a) {
std::cout << "int";
}
void fun(int *a) {
std::cout << "ptr";
}
int main() {
fun(0);
fun(NULL);
}
你会发现,函数都会调用int那个,这不是我们想要的,为了将两者区分开来,C++11引入了nullptr来表示空指针这个含义,把代码中的NULL替换为nullptr就可以调用指针那个函数。
nullptr可以自动转换为各种指针类型,但不会转换为整数类型,它也有自己的类型,是<cstddef>
中的std::nullptr_t,如果你对空指针有特殊要求,你可以根据这个类型来做。
特别有趣的是你可以这样写:
std::nullptr_t a = 0;
可以编译通过,但是似乎没什么用,但是把0换成其他就不能编译,其他数字不行,字符串啥的也不行,但是可以是nullptr。