見下文:是什麼意思定義引用作爲另一參考
int n = 0;
int &p = n;
int &k = p;
k = 99;
在k
的變化也影響n
值。背後的原理是什麼int &k = p;
我想知道它與int k = p;
有什麼不同。我知道k
的結果,但我想知道編譯器如何在後面。
見下文:是什麼意思定義引用作爲另一參考
int n = 0;
int &p = n;
int &k = p;
k = 99;
在k
的變化也影響n
值。背後的原理是什麼int &k = p;
我想知道它與int k = p;
有什麼不同。我知道k
的結果,但我想知道編譯器如何在後面。
將引用看作某種別名。變量p
是n
的別名,無論何時使用p
,實際上您都使用n
。這意味着k
也成爲n
的別名。
中的代碼而言,你能從編譯器級解釋它嗎? – henryyao
@henryyao:你問「你能解釋編譯器如何實現引用和解析C++代碼嗎?」因爲這超出了Stack Overflow問題的範圍......當然還有評論。你有沒有參加過三年的編譯器課程?這將是一個好的開始。然後瞭解C++工具鏈。你應該在十年左右時間內對他們有一個體面的瞭解。你爲什麼想知道? C++是_abstraction_。你不應該給出關於「編譯器級別」的飛行f ###。 –
@LightnessRacesinOrbit:我同意*「你能解釋編譯器如何實現引用[一般]和解析C++代碼嗎?」*將脫離SO的主題,但編譯器如何處理特定情況的問題實際上並不複雜(如JSF演示) – MikeMB
有編譯器的兩種基本策略,但不限於這兩個(無論達到了預期的語義可以使用):
1)在您的例子中,編譯器可以看到n
範圍有關的p
和k
範圍,因此它只是知道在編譯時間p
和k
是n
別名和您引用每次p
或k
它生成相同的代碼,如果你曾引用n
。這是一個不太常見的,但仍然重要的參考使用模式。
2)在較困難的情況下(編譯器),引用變量實際上是作爲指針實現的。所以,當你說int &p=n;
編譯器有效地替代int *hidden_p = &n;
再後來,當你說p
編譯器有效地替代(*hidden_p)
因此,當你說int &k=p;
,這意味着int &k=(*hidden_p);
這意味着int *hidden_k=&(*hidden_p);
這實際上意味着int *hidden_k=hidden_p;
這是否代碼甚至編譯? –
是的,它確實是互補的。我正在使用VS2005 – henryyao
爲什麼會有downvote? – henryyao