是否可以将对象设置为空?
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==
【讨论】:
以上是关于是否可以将对象设置为空?的主要内容,如果未能解决你的问题,请参考以下文章