2013-01-13 81 views
1

我期待b的值爲100以下,但我得到12。爲什麼會出現這種情況?顯然,我的c = b行不是將c指定爲b的別名?設置第二個變量的參考

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int a = 4; 
    int b = 12; 
    int& c = a; 

    c = 8; 

    cout << a << endl; 
    c = b; 
    c = 100; 

    cout << b << endl; 


    int bb; 
    cin >> bb; 
    return 0; 
} 

回答

7

顯然我c = b行不分配cb別名?

確切地說,引用不能是在C++中重新設置了c將始終是對a的參考。

c = b只是一個簡單的任務。

5

您無法重置參考文獻 - 您的c = b;一行僅指定給c(從而也就是a)當前值b

當您隨後將100指定爲c,b因此不會更改,因此打印時它仍然具有其原始值12

看到這個FAQ問題:

http://www.parashift.com/c++-faq/reseating-refs.html

1

c = b實際上執行以下操作:

  1. ca參考,所以我們要求對c任何操作實際上是在a工作。
  2. 我們正在分配到c - 這意味着,我們必須分配到a
  3. a是類型int的左值,因此將b賦值給它會將a的值更改爲b在那時的值。 (對於類型對象,這將稱爲複製賦值運算符。)
  4. b的值爲12,因此我們將此值設置爲a

就是這樣。沒有什麼改變什麼c指的是:之前是a,之後是a,現在只有a有不同的值。


顯然,你重新固定c,使其再指b。那麼,你不能用C++引用來做到這一點,而IMO這是一件好事。但你可以用指針來做到這一點:

#include <iostream> 

int main() { 
    int a = 4; 
    int b = 12; 
    int* c = &a; 

    *c = 8; 

    std::cout << a << std::endl; 
    c = &b; 
    *c = 100; 

    std::cout << b << std::endl; 

    return 0; 
} 

將輸出你期望從你的程序。