C++中 NULL 和 nullptr 的区别

在C++11及其后续版本中,NULL 和 nullptr 都是用来表示空指针的。但是它们有些许的区别:

  • NULL 是一个宏定义,通常被定义为0或者(void*)0。在C++11之前,NULL 被广泛用于指针值的初始化或比较操作。
  • nullptr 是一个关键字(keyword),是C++11引入的新特性。这个关键字的作用就是表示空指针,严格说 nullptr 不是一个整数类型也不是一个浮点数类型。
  • 两者的区别在于 nullptr 是类型安全的,而 NULL 不是

在某些情况下,使用 NULL 可能会导致编译器警告或错误。例如,在某些函数重载的情况下,使用 NULL 可能会导致函数调用的二义性。

使用 nullptr 可以避免这种二义性,同时也能提高代码的可读性和可维护性。因此在C++11及其后续版本中,建议使用 nullptr 来代替 NULL。

以下是一个示例程序,展示了使用 NULL 和 nullptr 的区别:

#include <iostream>
using namespace std;

void func(char* ptr) {
    
    
    cout << "Char pointer version\n";
}
void func(int ptr) {
    
    
    cout << "int version\n";
}
int main() {
    
    
    func(NULL);       // 无法通过编译,可能导致二义性
    func(nullptr);    // 仅调用char*版本
    return 0;
}

「总结」:NULL 在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了 nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议在新的代码中应该尽可能使用 nullptr 来表示空指针,而避免使用已经过时的 NULL 宏定义。

猜你喜欢

转载自blog.csdn.net/m0_51913750/article/details/130329239