在C ++中,对象可以为null吗?

时间:2011-10-28 16:58:20

标签: c++

这就是我所做的: 我有一个简单的课程:

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 ......

7 个答案:

答案 0 :(得分:8)

对象不能为空,只有指针才能。您的代码不正确且无法编译,因为它尝试从指向Person的指针初始化Person。如果您要将代码更改为

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

然后它会尝试从Person的解除引用的空指针初始化Person,这是未定义的行为(很可能是崩溃)。

如果您需要使用对象可能处于NULL状态的习语,您可以使用Boost.Optional

boost::optional< Person > myPer = boost::none;
if( myPer )
{
    myPer->do_something();
}

这是对指针通常所做的一般化,除了它不使用动态分配。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

这称为未定义的行为。当您尝试取消引用NULL或获取NULL的地址时,可能会出现意外结果。

答案 3 :(得分:0)

引用基本上是语法上更好的指示方式。

答案 4 :(得分:0)

您可以创建一个具有“NULL”状态的类。

E.g。拥有其他东西的类,例如文件句柄或窗口句柄或其他任何东西,这样它可以是空的。

您可以使用任何字符串类或任何容器类来查看它。

if(x.empty())...

但是“is null”的概念仅限于指针和智能指针(或您为了支持此类用例而重写的任何类。

答案 5 :(得分:0)

您不能在C ++中拥有NULL对象。您的第一次尝试是尝试将对象设置为等于指针,因此失败。

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

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

答案 6 :(得分:0)

我不会说以下是不可能的,因为C ++不允许

int main() {
  Person myPer = NULL;
}

这是可能的,C ++确实允许它。这完全取决于你如何定义班级Person。例如,如果类Person具有如下所示的构造函数:

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

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

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