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

问题描述 投票:0回答:7

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

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

c++ object null is-empty stdoptional
7个回答
75
投票

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

29
投票

虽然在 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
。有关详细信息,请检查编译器手册。


5
投票
您可以将任何指针设置为

NULL

,尽管 
NULL
 在 C++ 中简单地定义为 0:

myObject *foo = NULL;

另请注意,如果包含标准标头,则会定义

NULL

,但不会内置到语言本身中。  如果 
NULL
 未定义,您可以使用 0 代替,或包含以下内容:

#ifndef NULL #define NULL 0 #endif

顺便说一句,如果您确实想将对象而不是指针设置为

NULL

,您可以阅读有关 
空对象模式


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

在 C++ 中,NULL 指针与指向“空”对象的指针非常不同。

    为什么没有一个
  1. bool IsEmpty()
  2. 方法在对象的变量重置为某种默认状态时返回 true?我猜这可能会绕过 NULL 的用法。
  3. 拥有类似 
    A* p = new A; ... p = NULL;
  4. 的东西是不好的(不能删除 p),除非你能确保你的代码将被垃圾收集。如果有的话,这会导致内存泄漏,并且如果有几次这样的泄漏,您的代码很可能会很慢。
  5. 您可能想要这样做
    class Null {}; Null _NULL;
  6. ,然后根据您的情况重载其他类的operator=和operator!=。
  7. 
    
    也许您应该向我们发布一些有关上下文的详细信息,以帮助您更好地使用选项 4。
阿尔潘

什么类型的“对象”?

0
投票
您当然可以将

NULL

(和

nullptr

)分配给指针类型的对象,并且如果您可以将
NULL
分配给算术类型的对象,则它是实现定义的。 
如果您指的是某种类类型的对象,答案是 
NO

(除了具有

operator= 接受指针或算术类型的类)

“空”更合理,因为许多类型都具有复制分配和默认构造(通常是隐式的)。要查看
现有对象

是否类似于默认构造的对象,您还需要一个适当的

bool operator==


在 c++14 中你可以做类似的事情,

0
投票
MyClass ObjectName = *static_cast<MyClass*>(nullptr); void* check = &ObjectName; if(check){**object is NOT null**} else {**object IS null**}

英特尔检查器没有发现任何内存错误,所以我认为它是安全的,至少适合我的需求。 只要您不取消引用 ObjectName 并仅使用其地址,它就可以工作
    

是的,可以使用 NULL 关键字和以下方法在许多编程语言中将 null 值分配给任何数据类型的变量 int a =“NULL”; 这里 int 是变量 a 的数据类型,通过这种方法将 NULL 值赋给变量 a。

-3
投票

© www.soinside.com 2019 - 2024. All rights reserved.