53

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

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

4

5 回答 5

67

类的对象不能设置为 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;
于 2010-06-13T02:13:29.387 回答
21

虽然在 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代替。一些 C++17 之前的编译器还提供std::experimental::optional,其行为至少接近实际的std::optionalafaik。详细信息请查看编译器手册。

于 2018-01-26T01:17:53.360 回答
5

您可以设置任何指向 的指针NULL,尽管NULL在 C++ 中简单地定义为 0:

myObject *foo = NULL;

另请注意,NULL如果您包含标准标头,则已定义,但未内置于语言本身。如果NULL未定义,您可以使用 0 代替,或包含以下内容:

#ifndef NULL
#define NULL 0
#endif

顺便说一句,如果你真的想设置一个对象,而不是指针,NULL你可以阅读空对象模式

于 2010-06-13T02:15:21.910 回答
4

您想检查一个对象是否为 NULL/空。为 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!=。

也许您应该向我们发布有关上下文的一些详细信息,以帮助您更好地使用选项 4。

阿潘

于 2010-06-13T03:27:04.693 回答
0

什么类型的“对象”?

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

如果您指的是某种类类型的对象,答案是否定的(具有operator=接受指针或算术类型的类除外)

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

于 2018-01-26T14:21:13.390 回答