在c++中,can对象为空

In C++, can objects be null?

本文关键字:对象 can c++      更新时间:2023-10-16

我是这样做的:我有一个简单的类:

class Person{
  public:
    Person();
}
And in my main:
int main() {
  Person myPer = NULL;
}

这是不可能的,因为c++不允许这样做:

int main() {
  Person* perPtr = NULL;
  Person myPer = *perPtr; // corrected, it was &perPtr(typo error) before answers
}

这个编译得很好,正如我所看到的,我确实能够有一个NULL对象。那么,它是否违反了c++中只有指针可以为空的规则?或者c++中有这样的规则吗?第二个是在我写了这段代码之后,我添加了一个if语句检查myPer是否为NULL,但这给了我错误。这是否说明c++并不喜欢NULL对象的概念不管你怎么把对象设为NULL。

对象不能为空,只有指针可以。你的代码是不正确的,不能编译,因为它试图将一个Person从一个指针初始化为一个指向Person的指针。如果您要将代码更改为

Person* perPtr = NULL;
Person myPer = *perPtr;

那么它将尝试从指向Person的解引用空指针中初始化Person,这是未定义的行为(并且很可能崩溃)。

如果需要使用习惯用法,对象可能处于NULL状态,则可以使用Boost.Optional:

boost::optional< Person > myPer = boost::none;
if( myPer )
{
    myPer->do_something();
}
这是对指针通常所做的事情的概括,除了它不使用动态分配。

这是未定义的行为。 c++引用不能合法地设置为NULL。如果你想要一个"可空引用",使用指针。

这被称为未定义行为。当您试图解引用NULL或获取NULL的地址时,可能会出现意想不到的结果。

从语法上讲,引用是指针的一种更好的表达方式。

你可以创建一个状态为"NULL"的类。

。一个拥有其他东西的类,如文件句柄、窗口句柄或其他任何东西,因此它可以为空或不为空。

您可以在任何字符串类或容器类中看到这一点。

if (x.empty())…

但是"is null"的概念仅限于指针和智能指针(或任何您覆盖以支持此类用例的类)。

在c++中不能有NULL对象。你的第一次尝试是试图设置一个对象等于一个指针,因此失败。

你可以有一个NULL指针,引用只是语法略有不同的指针。

您可以取消引用NULL指针(编译器将允许您这样做),但这是未定义的行为。如果幸运的话,解引用NULL会崩溃,所以您知道发生了什么。

我不会说下面的是不可能的,因为c++不允许:

int main() {
  Person myPer = NULL;
}

这是可能的,c++也允许这样做。这完全取决于您如何定义Person类。例如,如果类Person有如下所示的构造函数:

class Person
{
  public:
    Person(char *) {}
};

那么Person myPer = NULL将编译得很好:http://www.ideone.com/586Pf

现在,这样的类有多大用处取决于你。人们可以利用上述事实,并可能提出酷和有用的(实用程序)类。