测试C+中的空指针值+; 我不清楚我怎么能在C++中做这件事。在Objective-C中,我可以用这种方式检查对象 if (myValue != [NSNull null]) { … } if (myValue != NULL) { qDebug() << "It is not null"; }

测试C+中的空指针值+; 我不清楚我怎么能在C++中做这件事。在Objective-C中,我可以用这种方式检查对象 if (myValue != [NSNull null]) { … } if (myValue != NULL) { qDebug() << "It is not null"; },c++,objective-c,null,C++,Objective C,Null,myValue与空对象(由类方法返回)进行比较,所以这非常有效,如果对象有值,即使是nil,if语句将返回true 所以问题是如何正确地测试空指针值,我是这样做的 if (myValue != [NSNull null]) { … } if (myValue != NULL) { qDebug() << "It is not null"; } if(myValue!=NULL) { C++中的QDUBGEL():没有真正的空值概念,只有空指针。不能比较不是指针的空值。<

myValue
与空对象(由类方法返回)进行比较,所以这非常有效,如果对象有值,即使是nil,
if
语句将返回
true

所以问题是如何正确地测试空指针值,我是这样做的

if (myValue != [NSNull null]) { … }
if (myValue != NULL)
{
    qDebug() << "It is not null";
}
if(myValue!=NULL)
{

C++中的QDUBGEL():没有真正的空值概念,只有空指针。不能比较不是指针的空值。< /P> < P>如果我是对的,你要检查空指针。这在C++

中其实很容易。
Foo *pInstanc = new Foo;
if(pInstance)
{
    //do something with pInstance
}

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
}

简短回答:这要看情况而定

更详细的回答:首先,您不能将引用(如果myValue的类型类似于T&)或堆栈分配对象(如果myValue只是T)与null进行比较-这些类型总是分配的,而不是null(除非你把事情搞砸或做了其他坏事——但你不会检查这些情况,因为你会遇到更大的问题)

可以检查null的唯一类型是指针(myValue是T*类型的东西)。对于这些类型:

  • 如果使用C++98,可以检查0。NULL通常只是一个宏(#define NULL 0)
  • 如果您使用新的C++11,则会有一个新的nullptr关键字,您应该对照此关键字进行检查
由于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):

模板
内联布尔为空(常量T*obj){
返回obj==((常量T*)0);
}
//要使用它:
如果(isNull(myType)){//myType是指向某个对象的指针
//一些代码
}
虽然我从来没有见过在实践中使用


<>希望这个答案有助于理解C++中的概念。< /P> MyValk的类型是什么?请添加更多代码吗?C++中没有空对象。但是,可以有空指针。还有Booost。可选的,如果需要一个空的对象类型。@ DevClass对象(类实例)总是有值-它们可能未初始化或为零,但总有一些值。您可以有一个空指针,它不指向任何值(但它本身有空值)@ DeXCODE:在C++中,没有一个对象没有值的概念。你可以使用一个指针,或者一个更高级的构造,比如<代码> Boo::可选的< /C> >,来模仿这样的事情,但是所有的对象都有值。+ 1,虽然你实际上可以做比较,反对和整数。但是它只是没有意义。@安东尼奥普雷兹按照标准,您可以将任何数字类型与
NULL
进行比较。但是,比较指针以外的内容会产生误导,如果您这样做,某些编译器会发出警告。“NULL指针”不是空内存地址;它是一个非常特殊的地址,保证不指向任何对象(在C++上下文中)。并且它不一定表示为零值(尽管这种情况很常见)在C++中,C++的标准是Bjarne Stroustrup和C++ 98,C++ 03,C++ 11,C90和C99。我在链接中没有看到任何东西。你给出了一个与我刚才所说不一致的结果。比亚恩只是在讨论他喜欢使用
0
而不是
NULL
(必须定义为“一个值为0的整型常量表达式”)。@JamesKanze抱歉,我不够精确。我只提到了部分“它不一定表示为零值(尽管这很常见)”,我过去也这么认为。@Offirmo可能是我不太精确:我的意思是空指针不一定都是0位。空指针常量必须是整型常量表达式(因此不是指针)它的计算结果为0。当您将其转换为指针类型时,编译器会尽其所能使其成为空指针,而不管空指针的表示形式如何。在C++90中,您始终可以与
null
;宏的计算结果保证为空指针常量。