2011-10-28 120 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

很多有用的這種類可現在怎麼會是你的。人們可以利用上述事實,並且可以拿出很酷且有用的(實用)類。

相關問題