确定空指针
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();
我有 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();