Skip to the content.

现代C++应该使用nullptr,而不是NULL

Contact me


在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。