确定空指针

Determining null pointer

我有 return 指向子对象的指针的函数。

函数原型:

ObjClass* ObjClass::getChildFromParent(ObjClass* parent = nullptr);

此函数的默认参数为空指针,无论如何我都想检查此参数,因为如果指针为空,我将 return nullptr 但如果不是,我将 return指向子对象的指针,因此:

ObjClass* ObjClass::getChildFromParent(ObjClass* parent)
{
    return parent == 0 ? nullptr : parent->getChild();
}

但我认为使用零检查空指针是不正确的。那么,我是否应该使用关键字来确定空指针?

使用nullptr关键字声明空指针并检查它更正确,例如:

int* example_ptr(0); // example_ptr is null pointer now

int ptr; // ptr is not initialized pointer 

我们可以使用赋值 0

使 ptr 空指针
ptr = 0; // ptr is null pointer now

如果您不想给它赋其他值,您应该使用零初始化指针。但在不同的情况下,最好使用 nullptr 关键字,因为编译器无法理解什么是零(整数值或空指针),但它并不总是发生。此关键字也优于 NULL 宏,因为它也被定义为零。

好吧,我应该像这样检查空指针:

ObjClass* ObjClass::getChildFromParent(ObjClass* parent)
{
    return parent == nullptr ? nullptr : parent->getChild();
}

只需将其与 nullptr 进行比较即可:

return parent == nullptr ? nullptr : parent->getChild();

您还可以使用上下文强制转换为布尔值:

return parent ? parent->getChild() : nullptr;

我更愿意写

ObjClass* ObjClass::getChildFromParent(ObjClass* parent = nullptr) {
    if(parent) 
        return parent->getChild();
    return nullptr;
}

这样就不那么混乱了。

根据 C++ 14 标准(5.10 相等运算符)

2 If at least one of the operands is a pointer, pointer conversions (4.10) and qualification conversions (4.4) are performed on both operands to bring them to their composite pointer type (Clause 5). Comparing pointers is defined as follows: Two pointers compare equal if they are both null, both point to the same function, or both represent the same address (3.9.2), otherwise they compare unequal.

和(4.10 指针转换)

1 A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type. Such a conversion is called a null pointer conversion...

因此 return 语句中的表达式

 return parent == 0 ? nullptr : parent->getChild();

是完全正确的,因为空指针常量0被转换为指针类型parent的空指针值。但是写成

会更有表现力
 return parent == nullptr ? nullptr : parent->getChild();