📅  最后修改于: 2023-12-03 14:51:38.393000             🧑  作者: Mango
在 C++11 中,引入了一个新的关键字 nullptr
。nullptr
是用来作为空指针常量使用的,它可以明确地指定一个指针为 NULL。在这篇文章中,我们将讨论如何在 C++ 中使用 nullptr
,以及它与其他指针类型的区别。
使用 nullptr
很简单。在需要用到空指针常量的时候,你只需要写 nullptr
就行了,例如:
int* ptr1 = nullptr; // 普通指针
void* ptr2 = nullptr; // 万能指针
在上面的例子中,ptr1
是一个普通的整数型指针,ptr2
是一个 void
类型的万能指针。两个指针都被明确地初始化为 nullptr
。
需要注意的是,nullptr
是一个关键字,而不是一个宏定义或者预处理指令。它不会被替换成某个值。
在 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
的出现是为了解决这个问题。它仅仅是一个空指针常量,不会被隐式转换为其他类型的指针。
指针类型在 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
可以帮助你避免一些隐式类型转换的问题。