我不清楚如何在C ++中这样做。在Objective-C中,我可以用这种方式检查对象
if (myValue != [NSNull null]) { … }
myValue
与null对象(由类方法返回)进行比较,因此这很有效,如果object有一个值,即使是nil,if
语句也将返回true
。< / p>
所以问题是如何正确测试空指针值,我这样做
if (myValue != NULL)
{
qDebug() << "It is not null";
}
但它不起作用。
答案 0 :(得分:5)
在C ++中,实际上没有空值的概念,只有空指针。你无法比较那些不是NULL指针的东西。
答案 1 :(得分:0)
如果我是对的,你想检查空指针。这在C ++中实际上非常简单
Foo *pInstanc = new Foo;
if(pInstance)
{
//do something with pInstance
}
答案 2 :(得分:0)
C ++中的指针实际上包含存储对象或数据的某个内存位置的地址。在这种情况下,“空指针”只是一个空的内存地址。这表示为零值。所以要检查它,你会写这样的东西:
SomeClass *someClassPointer = // ... call some method to get pointer
// Check for null pointer
if (someClassPointer == 0)
{
// Pointer is null
}
这可以通过以下方式简化:
if (someClassPointer)
{
// For checking that the pointer is not null
}
if (!someClassPointer)
{
// For checking that a pointer is null
}
答案 3 :(得分:0)
简短回答:这取决于。
更长的答案:首先你不能比较一个引用(如果myValue的类型是T&amp;),也不能比较堆栈分配的对象(如果myValue只是T)为null - 这些类型总是被分配而不是null(除非你搞砸你的堆栈或做其他坏事 - 但你不会检查这些情况,因为你会遇到更大的问题。)
您可以检查null的唯一类型是指针(myValue是T *类型的东西)。对于这些类型:
由于0计算为false而其他任何内容为true,因此您也可以像普通bool一样使用指针。 nullptr的类型为nullptr_t并且实现了运算符bool() - 所以你也可以像使用bool一样。
一般情况下:在C ++ 98中缺少nullptr是错误的来源,所以如果你可以使用C ++ 11,总是使用nullptr - 永远不要使用NULL或0(int只是要分配的错误类型指针或与指针进行比较 - 如果你有重叠的方法,你会遇到问题,因为编译器会使用带有int参数的方法而不是指针类型(如果合适的话)。
假设您有两个功能:
void foo(int a);
void foo(void *);
如果你现在打电话
foo(NULL);
第一个函数将被调用(可能不是你想要的。所以在C ++ 11中你会写:
foo(nullptr);
在C ++ 98中你必须写:
foo((void *)0);
这就是为什么在C ++ 98之前缺少null是一个大问题的原因之一。如果你想拥有与Objective-C类似的东西,你可以编写以下函数(对于C ++ 98):
template<typename T>
inline bool isNull(const T *obj) {
return obj == ((const T *) 0);
}
// to use it:
if (isNull(myType)) { //myType is a pointer to something
// some code
}
虽然我从未见过在实践中使用过的那个。
我希望这个答案有助于理解C ++中的概念。