2015-11-13 113 views
0

見下文:是什麼意思定義引用作爲另一參考

int n = 0; 
    int &p = n; 
    int &k = p; 
    k = 99; 

k的變化也影響n值。背後的原理是什麼int &k = p;我想知道它與int k = p;有什麼不同。我知道k的結果,但我想知道編譯器如何在後面。

+0

這是否代碼甚至編譯? –

+0

是的,它確實是互補的。我正在使用VS2005 – henryyao

+0

爲什麼會有downvote? – henryyao

回答

3

將引用看作某種別名。變量pn的別名,無論何時使用p,實際上您都使用n。這意味着k成爲n的別名。

+0

中的代碼而言,你能從編譯器級解釋它嗎? – henryyao

+0

@henryyao:你問「你能解釋編譯器如何實現引用和解析C++代碼嗎?」因爲這超出了Stack Overflow問題的範圍......當然還有評論。你有沒有參加過三年的編譯器課程?這將是一個好的開始。然後瞭解C++工具鏈。你應該在十年左右時間內對他們有一個體面的瞭解。你爲什麼想知道? C++是_abstraction_。你不應該給出關於「編譯器級別」的飛行f ###。 –

+0

@LightnessRacesinOrbit:我同意*「你能解釋編譯器如何實現引用[一般]和解析C++代碼嗎?」*將脫離SO的主題,但編譯器如何處理特定情況的問題實際上並不複雜(如JSF演示) – MikeMB

3

有編譯器的兩種基本策略,但不限於這兩個(無論達到了預期的語義可以使用):

1)在您的例子中,編譯器可以看到n範圍有關的pk範圍,因此它只是知道在編譯時間pkn別名和您引用每次pk它生成相同的代碼,如果你曾引用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;