C++引用是別名。這樣做的效果是,對指針的解引用不一定發生在它們出現的地方,它們發生在它們被評估的地方。對一個對象的引用不會評估該對象,它會對其進行別名。使用參考是評估對象的東西。 C++不能保證引用是有效的;如果是這樣,所有的C++編譯器都會中斷。這樣做的唯一方法是通過引用消除動態分配的所有可能性。在實踐中,假設是一個引用是一個有效的對象。由於* NULL未定義爲&無效,因此對於p = NULL,* p也未定義。 C++的問題是* p將被有效地傳遞給一個函數,或者延遲到它的評估,直到實際使用該引用爲止。認爲它是未定義的不是提問者問題的要點。如果它是非法的,編譯器會強制執行它,標準也是如此。我也沒有意識到這一點。
int &r = *j; // aliases *j, but does not evaluate j
if(r > 0) // evaluates r ==> *j, resulting in dereference (evaluate j) at this line, not what some expect
;
1)可以測試混疊NULL指針的引用,& r是簡單地&(無論ř別名)(編輯)
2)當通過一個 「引用」 指針(* I )作爲參考參數,取消引用不會發生在調用網站,它可能永遠不會發生,因爲它是引用(引用是別名,而不是評估)。這是參考文獻的優化。如果它們在調用點進行評估,編譯器會插入額外的代碼,或者它會是一個按值調用,性能比指針低的調用。
是的,引用本身不是NULL,它是無效的,就像* NULL是無效的。這是推遲評估解引用表達式與聲明不可能具有無效引用不一致的原因。
#include <iostream>
int fun(int & i) {
std::cerr << &i << "\n";
std::cerr << i << "\n"; // crash here
}
int main() {
int * i = new int();
i = 0;
fun(*i); // Why not crash here? Because the deref doesn't happen here, inconsistent, but critical for performance of references
}
編輯:改變了,因爲它已經被誤解爲建議用於測試的參考,不是我想證明我的例子。我只想證明無效的參考。
相關:http://stackoverflow.com/questions/1919608/checking-for-null-before-pointer-使用/ 1921403#1921403。 – 2010-03-26 16:50:07
「我怎麼知道對象的內存在你初始化引用後沒有被釋放/刪除。」你怎麼知道某人沒有爲你的類型「reinterpet_cast」一些完全不正確的對象,並將其作爲參考傳遞給它?或者破壞了他們物體中的記憶,然後傳給你?在C和C++中,你不必依靠你的調用者來做一個muppet。如果他們做了一些語言定義爲無效的東西,比如解引用一個空指針或者刪除一個對象,但是保留對它的引用,那麼這就是他們的錯誤,他們可以調試它。 – 2010-03-26 16:52:50