2014-07-14 2 views
0

다음 두 코드 간의 차이점을 찾기 위해 열심히 노력했습니다. 나는 그것이 y=10 반환 된 프로그램을 실행했을 때C++에서 참조 변수 저장

int& foo() 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int y=foo(); 
    cout<<y; 
    return 0; 
} 

다음은 오류가 발생하지 않는 반면

이 ...

int z=10; 
int y=&z; 

은 ... 유효하지 않습니다.

내 질문은 :

y 경우 foo()를 사용하여 다른 변수의 참조를 저장할 수 있습니다, 왜 직접 y=&z를 사용하지?

+0

'& z'가'int'에 대한 포인터이기 때문에 처음으로 잘못되었습니다. 두 번째 변수는 지역 변수에 대한 참조를 반환하기 때문에 정의되지 않은 동작입니다. – juanchopanza

+0

"int y = & z"여기에 주소를 저장하고 있습니다 ... 참조가 아닙니다 ... –

답변

0
int z=10; // create integer z and set it to the value 10. 
int y=&z; // create integer y and set it to the address of z 

위의 코드는 참조와는 아무 상관이 없습니다 ....

int &y = z; // create a reference (y) to integer z 

더 당신이 원하는 같다.

-2

이 함수를 사용하면 함수가 스택의 값을 밀어 내지 않고 단순히 값을 참조로 반환한다는 것을 나타냅니다. 단순한 int에서는 다소 의미가 없지만 구조체 나 클래스를 반환하는 경우에는 더 유용합니다.

y=&z의 경우 int를 주소와 같게 설정하려고합니다.

+0

이것은 내 코멘트가 아니지만 이상하게도 내 포인트는 stackoverflow 포인팅 시스템에서 총 버그가 차감되었습니다. –

1

만들려는 경우 참조 변수 대신 당신이 z에 사업자의 주소를 적용 의미를 복용하고있어,

int z=10; 
int& y=z; 
//int y = &z; this is not correct. 
4
int y=&z; 

앰퍼샌드 위 y를 표시하지 않는이 참조하면된다 그것의 주소. 여기

int& y=z; 

yz 참조한다. 두 번째 예에서


당신은 정의되지 않은 동작을 가지고 있기 때문에 함수에 로컬 변수에 대한 참조를 반환 foo() 기능. z에 대한 foo()의 저장소는 함수가 반환 될 때 중단되고 반환 된 참조를 통해 액세스하는 것은 정의되지 않은 동작입니다.

+0

'&'의 의미는이 두 경우에서 완전히 다릅니다. 참조를 선언 할 때 다른 기호가 사용 되었다면 좋을 것입니다. (그러나 모든 공통 기호는 이미 사용 중이므로 아마도 옵션이 아닙니다!) –

1

yint& y 대신 yint y으로 정의되어 있기 때문에 참조가 아닌 값이 저장됩니다. 이 때문에 foo()은 참조를 반환하지만 y은 참조의 값을 저장합니다 ... 즉 10입니다.

다음 코드 실패 : C++에서

int& foo() 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int& y = foo(); // <-- now y is a reference 
    cout<<y;  // <-- at this point z does not exists 
    return 0; 
} 
+0

'y'는 아무 것도 값을 저장하지 않습니다. 'foo()'가 호출되고'y'를 초기화하는 데 사용되는 리턴 값은 UB입니다. – juanchopanza

0

가 기준 변수 별명 유사하다 (AS-IF 동일한 변수를 액세스하기위한 다른 이름을 갖는).따라서,

int z=10; 
int &y=z; // y is a reference variable, and shares same space of z 
y++; // this makes z++ effectively, i.e. z becomes 11 

와 당신이 지금

int y = &z; // your example is wrong, as rvalue is int * and lvalue is int 

int& foo() 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int y=foo(); 
    cout<<y; 
    return 0; 
} 

이 로컬 변수 (Z)의 참조를 반환하는 것처럼 어떤을 가고, 위험하다 foo에서 돌아 오면 파괴 될 것이다. 함수에서 반환 할 때 지역 변수가 범위를 벗어나므로이 값은 참조 대신 값을 반환하는 것처럼 사용되었을 것입니다. 따라서 올바른 사용법은 다음과 같습니다.

희망이 있습니다. 조언은 결코 지역 변수의 참조를 반환하지 않습니다.

+0

는 약간의 문제가되어야합니다, 나는 이상한 점이 있습니다. –

1

문제는이 코드이다

int& foo() 
{ 
    int z=10; 
    return z; 
} 

Z는 그 범위 푸 기능-에 내부 변수이다. 기능 본체가 끝나자 마자 z는 더 이상 메모리에 없습니다. 그러나 우리는 내부 변수의 참조를 외부 세계에 전달했습니다 (범위를 벗어남).