📜  了解C++中的nullptr(1)

📅  最后修改于: 2023-12-03 15:21:39.315000             🧑  作者: Mango

了解C++中的nullptr

简介

在C++11标准中,新增了关键字nullptr,用于表示空指针。它的引入是为了解决旧标准中对于空指针的模棱两可的表达式,如下:

int* p = NULL; // 可编译通过
int* q = 0;    // 可编译通过

上述代码中,NULL在C++中实际上被定义为0,因此pq实际上都是指向空地址的指针。

使用nullptr既能够保留对于空指针的明确语义,又能够避免由于传递0常常导致的潜在bug。

nullptr的用法
声明空指针

使用nullptr可以显式地声明空指针。

int* p = nullptr;

这样的声明在代码中更为清晰地表达了指针变量为空的语义。

与普通指针的转换

nullptr可以和普通指针进行隐式或显式的类型转换。

int* p = nullptr;
void* q = nullptr;

通过上述代码,可以看到nullptr在指针类型转换方面的灵活性。

与布尔类型的转换

nullptr也可以隐式转换为布尔类型,在if语句等上下文中能够起到更加明确的判断作用。

int* p = nullptr;
if (p) {
    std::cout << "p is not null" << std::endl;
} else {
    std::cout << "p is null" << std::endl;
}

上述代码中,if语句的判断条件为nullptr。因为nullptr可以被隐式转换为false,所以最终输出结果为“p is null”。

与nullptr的比较

nullptr可以和其它各种指针类型进行比较,表达指针是否为空的语义。

int* p = nullptr;
int* q = new int(42);
if (p == nullptr) {
    std::cout << "p is null" << std::endl;
} else {
    std::cout << "p is not null" << std::endl;
}
if (q != nullptr) {
    std::cout << "q is not null" << std::endl;
} else {
    std::cout << "q is null" << std::endl;
}

上述代码中,分别展示了nullptr与空指针和非空指针的比较方法。

总结

使用nullptr可以使得代码中对于空指针的语义更加明确和清晰,同时能够有效地避免由于传递0等常量导致的潜在错误。建议在编写C++代码时尽量使用nullptr,以增加代码的可读性和可靠性。