2010-01-29 29 views
9

我已經從維基百科上寫着:引用不能爲NULL或可以爲NULL?

「References cannot be null, whereas pointers can; every reference refers to some object, although it may or may not be valid.」

但我不因爲下面的代碼看看它的編譯器沒有給出錯誤認爲:

class person 
{ 
public: 
virtual void setage()=0; 
}; 
main() 
{ 
person *object=NULL; 
person &object1=*object; 
} 

請詳細說明了這一點。

+7

文章或許應該說:「在一個結構良好的程序中的每個參考引用了一個對象」解引用空指針當然是不合格的。 – GManNickG 2010-01-29 21:08:45

+0

我想你的意思是'person&object1 = object;',這確實會給你一個編譯器錯誤(不匹配的類型)。 – 2010-01-29 21:10:26

+8

讓我們不是都忘記我們最喜歡的空引用的故事:http://www.gotw.ca/conv/002.htm – GManNickG 2010-01-29 21:12:14

回答

9

說法person &object1=*object與說person &object1=NULL不一樣。編譯器可能不夠聰明,無法發現你正在解引用空指針,但是無論如何你會得到一個運行時錯誤。所以他們是真的仍然;)

+0

好的,好吧我明白你的觀點非常清楚謝謝 – 2010-01-29 21:04:13

20

在您的代碼:

person *object=NULL; 
person &object1=*object; 

取消引用NULL指針,所以你得到了一個未定義的行爲。而要回答你的問題,沒有這樣的事情作爲NULL引用。

爲了解決你的問題的其他部分,僅僅因爲一個程序編譯,不能保證它是正確的或它會工作。甚至不需要C++編譯器來嘗試診斷代碼中包含的錯誤類型。

2

那麼,你可以做什麼希望在C++。另一個例子:

person &object1 = *(reinterpret_cast<person*>(0)); 

在上述情況下,除了您提到的情況外,您正在調用未定義的行爲!

+0

謝謝尼爾,我糾正了它。 – AraK 2010-01-29 20:57:58

+0

是否有你喜歡'reinterpret_cast'到'static_cast'的原因? (他們的行爲在這種情況下當然是相同的。) – avakar 2010-01-29 22:33:47

+0

@avakar當我寫下答案時,這就是我的想法:) – AraK 2010-01-29 22:46:03

3

會導致程序崩潰。你嘗試過運行它嗎?執行*對象會考慮一個空指針,所以實際上你的引用永遠不會被分配。

+0

答案我明白了。 – 2010-01-29 21:03:35

+0

我不認爲它會崩潰。它只會在您嘗試訪問object1的成員(或方法)時崩潰。 – Julio 2010-01-29 21:30:45

+2

它可能會崩潰,打印42或發出藍煙 - 只需對空指針進行拒絕調用未定義的行爲,以免事先知道。 – 2010-01-29 21:36:05

3

你可以有一個空引用,不知道爲什麼有人會說,否則,這是一些操作的討厭的副作用。你不能直接創建一個。

+0

我不應該爲驚訝地看到下調,我總是可以告訴那些認爲他們什麼都不知道的愚蠢星球的人。 – 2010-01-29 22:36:37

+2

您可以在實踐中獲得NULL引用*。每當有人說「你*不能擁有NULL引用」時,它應該在一個格式良好的程序中讀*。除了取消引用NULL指針外,還可以創建一個引用,以便通過自我初始化來實現'&ref == NULL':'int&ref = ref;'(結果可以是任何東西,包括NULL,我想)。 - 我認爲覆蓋問題的實用方面不會有什麼問題,但是你的回答是模糊的,無信息的和爭論性的(「儘管大家都說,這裏有點亂碼」)。 – UncleBens 2010-01-29 22:50:18

+0

@UncleBens,* Null *引用具有語言不支持的內涵。我認爲* invalid * reference更好地描述了這種情況。這是一個微妙的差異,但我認爲它沒有爭議。 – 2012-07-31 23:12:10

0

鐺3.5甚至警告說,在參考的可能後空檢查:

/tmp/person.C:11:6: warning: reference cannot be bound to dereferenced null pointer in well-defined C++ code; pointer may be assumed to 
     always convert to true [-Wundefined-bool-conversion] 
if (&object1) {} 
~~ ^~~~~~~ 
1 warning generated. 
相關問題