是否可以将对象设置为null?

时间:2010-06-13 02:12:29

标签: c++ object null is-empty stdoptional

此外,在我的代码中,我检查是否检查对象是否为空/空。

有没有办法将对象设置为null?

5 个答案:

答案 0 :(得分:40)

类的对象不能设置为NULL;但是,您可以将指针(包含对象的内存地址)设置为NULL。

你不能做的事情的例子:

Cat c;
c = NULL;//Compiling error

你可以做什么的例子:

Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;

答案 1 :(得分:8)

虽然在C ++中对象不能是“空/空”,但在C ++ 17中,我们得到了std::optional来表达这种意图。

使用示例:

std::optional<int> v1;      // "empty" int
std::optional<int> v2(3);   // Not empty, "contains a 3"

然后,您可以检查optional是否包含带

的值
v1.has_value(); // false

if(v2) {
    // You get here if v2 is not empty
}

然而,普通int(或任何类型)在任何有用的意义上都不能是“空”或“空”(通过你对这些词的定义)。在这方面考虑std::optional作为容器。

如果您手头没有符合C ++ 17的编译器,则可以使用boost.optional代替。一些pre-C ++ 17编译器还提供std::experimental::optional,其行为至少接近实际的std::optional afaik。有关详细信息,请查看编译器手册。

答案 2 :(得分:4)

您想要检查对象是否为空/空。 NULL和空是不一样的。就像Justin和Brian已经提到的那样,在C ++中,NULL是一个你通常与指针相关联的赋值。您可以重载operator =也许,但如果您真的想要这样做,请认真考虑。其他一些事情:

  1. 在C ++中,NULL指针与指向“空”对象的指针非常不同。
  2. 如果对象的变量重置为某个默认状态,为什么没有bool IsEmpty()方法返回true?猜猜可能会绕过NULL使用。
  3. A* p = new A; ... p = NULL;这样的东西很糟糕(没有删除p),除非你能确保你的代码被垃圾收集。如果有的话,这会导致内存泄漏,并且有几次这样的泄漏,很可能你的代码很慢。
  4. 您可能希望执行此操作class Null {}; Null _NULL;,然后根据您的具体情况重载其他类的operator =和operator!=。
  5. 也许您应该向我们发布一些有关上下文的详细信息,以便更好地使用选项4。

    Arpan

答案 3 :(得分:3)

您可以设置指向NULL的任何指针,但在C ++中NULL只是定义为0:

myObject *foo = NULL;

另请注意,如果您包含标准标头,则会定义NULL,但不会在语言本身内置NULL。如果#ifndef NULL #define NULL 0 #endif 未定义,则可以改为使用0,或者包括:

NULL

顺便说一句,如果你真的想要设置一个对象而不是指针{{1}},你可以阅读Null Object Pattern

答案 4 :(得分:0)

什么类型的“对象”?

您当然可以将NULL(和nullptr)分配给指针类型的对象,如果可以将NULL分配给算术类型的对象,则它是实现定义的。

如果您指的是某些类类型的对象,答案是 NO (除了operator=接受指针或算术类型的类之外)

“空”更合理,因为许多类型都有复制赋值和默认构造(通常是隐式的)。要查看现有对象是否类似于默认构建对象,您还需要适当的bool operator==