这就是我所做的: 我有一个简单的课程:
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 ......
答案 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
现在这个课程有多大用处取决于你。人们可以利用上述事实,并可能提出很酷且有用的(实用)类。