此外,在我的代码中,我检查是否检查对象是否为空/空。
有没有办法将对象设置为null?
答案 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 =也许,但如果您真的想要这样做,请认真考虑。其他一些事情:
bool IsEmpty()
方法返回true?猜猜可能会绕过NULL使用。A* p = new A; ... p = NULL;
这样的东西很糟糕(没有删除p),除非你能确保你的代码被垃圾收集。如果有的话,这会导致内存泄漏,并且有几次这样的泄漏,很可能你的代码很慢。 class Null {}; Null _NULL;
,然后根据您的具体情况重载其他类的operator =和operator!=。 也许您应该向我们发布一些有关上下文的详细信息,以便更好地使用选项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==