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

Posted

技术标签:

【中文标题】是否可以将对象设置为空?【英文标题】:Is it possible to set an object to null? 【发布时间】:2011-03-03 03:07:16 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

一个类的对象不能设置为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;

【讨论】:

顺便说一句,对于想要提出它的人来说,是的,您可以重载 operator= 但这不是 OP 想要的。 第一个可以使用Cat::operator=(...)。无论如何,看起来OP真的想检查一个指针。所以,+1。 @jweyrich:我知道有人会这么说,所以在你发表评论之前先看看我的评论 :) 抱歉,我在发表评论之前没有更新页面。这只是为了完整性。很高兴你提到:) @wulfgarpro 对于nullptr,您不需要任何包含,它是一个关键字。【参考方案2】:

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

myObject *foo = NULL;

还要注意NULL 是在包含标准头文件时定义的,但不是内置在语言本身中的。如果 NULL 未定义,您可以使用 0 代替,或者包含以下内容:

#ifndef NULL
#define NULL 0
#endif

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

【讨论】:

【参考方案3】:

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

    在 C++ 中,NULL 指针与指向“空”对象的指针非常不同。 为什么不使用bool IsEmpty() 方法在对象的变量重置为某些默认状态时返回true?猜猜这可能会绕过 NULL 用法。 拥有类似A* p = new A; ... p = NULL; 的东西是不好的(没有删除p),除非你能确保你的代码会被垃圾回收。如果有的话,这会导致内存泄漏,并且有几个这样的泄漏很有可能你的代码很慢。 您可能希望这样做class Null ; Null _NULL;,然后根据您的情况重载其他类的 operator= 和 operator!=。

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

阿潘

【讨论】:

“为什么不使用 bool IsEmpty() 方法...” - 有一些很好的理由不这样做。最重要的是,它是否有意义通常取决于上下文。更健壮的解决方案是使用boost::optional<T> 来指示您是否拥有有效的 T 对象。这将阻止您在 x.IsEmpty()==true 时调用 x.foo()【参考方案4】:

虽然在 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(或任何类型)在任何有用的意义上都不能是“null”或“empty”(根据您对这些词的定义)。在这方面将std::optional 视为一个容器。

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

【讨论】:

或者std::experimental::optional,如果你的编译器提供了。【参考方案5】:

“一个对象”是什么类型的?

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

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

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

【讨论】:

以上是关于是否可以将对象设置为空?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 将默认设置为空对象

Mongoose 将默认设置为空对象

freemarker判断对象是否为空

Freemarker判断是否为空

我应该让我的对象属性为空还是为每种类型使用 CLR 默认值?

freemarker判断对象是否为空或是否存在