📜  声明 nullptr c++ (1)

📅  最后修改于: 2023-12-03 14:51:38.393000             🧑  作者: Mango

声明 nullptr C++

在 C++11 中,引入了一个新的关键字 nullptrnullptr 是用来作为空指针常量使用的,它可以明确地指定一个指针为 NULL。在这篇文章中,我们将讨论如何在 C++ 中使用 nullptr,以及它与其他指针类型的区别。

基础用法

使用 nullptr 很简单。在需要用到空指针常量的时候,你只需要写 nullptr 就行了,例如:

int* ptr1 = nullptr;  // 普通指针
void* ptr2 = nullptr; // 万能指针

在上面的例子中,ptr1 是一个普通的整数型指针,ptr2 是一个 void 类型的万能指针。两个指针都被明确地初始化为 nullptr

需要注意的是,nullptr 是一个关键字,而不是一个宏定义或者预处理指令。它不会被替换成某个值。

与 NULL 的区别

在 C++ 中,我们经常使用 NULL 来表示一个空指针。但是,NULL 实际上只是一个宏定义,其值可被定义为以下不同的方式:

#define NULL 0 // C++98 和 C90 标准
#define NULL ((void*) 0) // C++11 标准

正如你所看到的,NULL 的值可以是整数 0 或者一个 void* 类型的指针。因此,当你这样用时:

int* ptr = NULL;

你其实是在使用一个整数型的 0 来初始化一个指针,这样做是可以工作的。但是,当你这样做时:

void* ptr = NULL;

你实际上是在使用一个 void 类型的 NULL 来初始化一个指针,这样做同样也可以工作。但是,这两种方式都不是非常严谨。

nullptr 的出现是为了解决这个问题。它仅仅是一个空指针常量,不会被隐式转换为其他类型的指针。

与 bool 的关系

指针类型在 C++ 中可以自动转换为布尔类型。就像下面的例子:

int* ptr = new int;
if (ptr) // 等同于 if (ptr != nullptr)
{
    // 当指针不为空时执行操作
}

上面的例子中,当 ptr 不为空时,布尔类型的条件表达式就会返回 true。

但是,使用 NULL 时有一个问题,因为 NULL 可以被定义为数字 0 或者 void* 类型的空指针。如果你这样写:

int* ptr = new int;
if (ptr == NULL) // 这个比较会进行整数和指针之间的隐式类型转换
{
    // ...
}

这样做行得通,但是它进行了一个整数型与指针型之间的隐式类型转换。在某些情况下,这种类型转换可能会导致错误。

使用 nullptr 可以避免这个问题,因为它不能被转换成其他任何类型。例如:

int* ptr = new int;
if (ptr == nullptr)
{
    // ...
}
总结

nullptr 是一个关键字,用来表示一个空指针常量。它仅仅是一个空指针,在 C++ 中不会被转换成其他任何类型。使用 nullptr 可以帮助你避免一些隐式类型转换的问题。