在我的代码中,我检查对象是否为空/空。
有没有办法将对象设置为空?
类的对象不能设置为 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;
虽然在 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::optional
afaik。详细信息请查看编译器手册。
您可以设置任何指向 的指针NULL
,尽管NULL
在 C++ 中简单地定义为 0:
myObject *foo = NULL;
另请注意,NULL
如果您包含标准标头,则已定义,但未内置于语言本身。如果NULL
未定义,您可以使用 0 代替,或包含以下内容:
#ifndef NULL
#define NULL 0
#endif
顺便说一句,如果你真的想设置一个对象,而不是指针,NULL
你可以阅读空对象模式。
您想检查一个对象是否为 NULL/空。为 NULL 和为空是不一样的。就像 Justin 和 Brian 已经提到的那样,在 C++ 中,NULL 是一个通常与指针相关联的赋值。您也许可以重载 operator=,但如果您真的想这样做,请仔细考虑。其他几件事:
bool IsEmpty()
如果对象的变量被重置为某些默认状态,为什么不使用返回 true 的方法呢?猜猜这可能会绕过 NULL 用法。A* p = new A; ... p = NULL;
除非你能确保你的代码会被垃圾收集,否则拥有类似的东西是不好的(没有删除 p)。如果有的话,这会导致内存泄漏,并且有几个这样的泄漏很有可能你的代码很慢。class Null {}; Null _NULL;
,然后根据您的情况重载其他类的 operator= 和 operator!=。也许您应该向我们发布有关上下文的一些详细信息,以帮助您更好地使用选项 4。
阿潘
什么类型的“对象”?
您当然可以将NULL
(和nullptr
)分配给指针类型的对象,并且如果您可以分配NULL
给算术类型的对象,则它是实现定义的。
如果您指的是某种类类型的对象,答案是否定的(具有operator=
接受指针或算术类型的类除外)
“空”更合理,因为许多类型同时具有复制分配和默认构造(通常是隐式的)。要查看现有对象是否类似于默认构造的对象,您还需要一个适当的bool operator==