2011-10-28 83 views
0

这里是我做了什么: 我有一个简单的类:在C++中,对象可以为null吗?

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

+2

'Person myPer =&perPtr;'是一个类型错误。你是不是指'Person myPers = * perPtr;'? – delnan

+5

欢迎来到Stack Overflow!如果你正在学习C++,我会给你这个最重要的提示:仅仅因为它编译它并不意味着它是有效的或它应该工作。同样,仅仅因为它按照您的预期编译和运行,并不意味着它也是正确的。是的,C++是一个非常苛刻的语言:(我会推荐[很好的介绍C++书](http://stackoverflow.com/q/388242/46642)。 –

+3

“这编译好”。不,它不。请复制粘贴(而不是重新输入)你编译的程序。 –

回答

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

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

0

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

+0

有一个头发不仅仅是语法,但只有一个头发。引用不能合法地为NULL,我也不能不要重置。 –

+0

是的,因此“基本上”;-) –

+0

我只是谨慎,因为有很多人认为引用是指向语法糖的指针,然后结束了解引用NULL指针。 –

4

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

0

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

E.g.一个拥有别的东西的类,例如文件句柄或窗口句柄或其他任何东西,以至于它可以是空的或不是空的。

你可以看到这与任何字符串类或任何容器类。

如果(x.empty())...

但是,“为空”的概念仅限于指针和智能指针(或重写以支持这样的用例的任何类。

0

你不能在C++中有一个NULL对象,你的第一次尝试就是设置一个对象等于一个指针,从而失败

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

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

0

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

int main() { 
    Person myPer = NULL; 
} 

这是可能的,而C++确实允许它。这一切都取决于你如何定义类Person。例如,如果类Person有一个构造函数,如下所示:

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

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

很多有用的这种类可现在怎么会是你的。人们可以利用上述事实,并且可以拿出很酷且有用的(实用)类。

相关问题