2013-01-13 1 views
1

b 값을 100으로 예상했지만 12가되었습니다. 왜 그런가요? 분명히 내 c = b 라인이 b에 대한 별칭으로 c를 지정하지 않고 있습니까?두 번째 변수에 대한 참조 설정

#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 라인은 b에 대한 별칭으로 c 할당되지 않는 이유는 무엇입니까?

정확히 C 참조에서 으로 다시 채울 수 없습니다. c은 항상 a에 대한 참조입니다.

c = b은 단순한 과제입니다.

5

참조를 다시 연결할 수 없습니다. c = b; 라인은 현재 b의 값인 c (따라서 a)에 할당됩니다.

당신이 다음 100c에 당신이 그것을 밖으로 인쇄 할 때 여전히 12의 원래 값을 가지고 있으므로, b 따라서, 변경되지 않습니다 지정

. 사실

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

1

c = b는 다음을 수행합니다 :

이 자주 묻는 질문 질문을 참조

  1. ca에 대한 참조입니다, 그래서 우리는 c에 요청 작업이 모두 실제로 a에서 작동합니다 .
  2. 우리는 c에 할당하고 있습니다. 즉, 실제로는 a에 할당해야합니다.
  3. a은유형의 lvalue이므로 b에 할당하면 a의 값이 그 시점의 값 b으로 변경됩니다. (클래스 형 객체의 경우 복사 할당 연산자가 호출됩니다.)
  4. b의 값은 12이므로이 값을 a으로 지정합니다.

그리고 그게 전부입니다. c이 무엇을 의미하는지에 대해서는 아무것도 변경되지 않았습니다. 이전에 a이었고 그 이후에 a 이었으므로 이제는 a 만 다른 값을 갖습니다.


분명히 당신은 다음 b를 참조하도록 c를 다시 장착 원하는 . 글쎄, 당신은 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; 
} 

당신의 프로그램에서 예상 한 것을 출력 할 것입니다.

관련 문제