2011-12-26 2 views
6

그래서 저는 C++을 배우려고 시도하고 있습니다. 나는 코드,C++에서 참조의 설명

int x = 0; 
int &y = x; 
cout << &x<< " " << x << " " << &y << " " <<y<< endl; 

이 잘 컴파일하고 결과가 있습니다

0 003AFA08 0 003AFA08 

나는 문제 & Y, 참조에 X, int로의 변환,하지 않는 이유는 이해가 무엇 오류가 발생합니다. 처음에 나는 그것이 그러나 변환의 일종이었다 오류가

int &y = &x; 

결과를 생각했다.

누구나 이런 방식으로 작동하는 이유를 설명 할 수 있습니까? 미리 감사드립니다.

+0

그래서 스트림 삽입 연산자'<<'가 변수의 주소를 숫자 16 진수 문자열로 문자열화 할 수 있지만'int' (int 형) 주소를 할당 할 수없는 이유를 알고 싶습니다. 'int '에? – bobbymcr

+3

'003AFA08 0 003AFA08 0' – onemach

답변

11

int&주소이 아닙니다. 참조입니다.

int& y = x;x에 대한 참조로 y을 선언합니다. 이는 yx의 다른 이름이된다는 것을 의미합니다. y을 사용할 때는 항상 x이라고 말한 것입니다.

포인터 (참조 제외)는 주소를 저장하는 데 사용됩니다. &x의 주소가 x (int*)이므로 int& y = &x;은 유효하지 않습니다. yint에 대한 참조이며 int*에 대한 참조는 아닙니다.

+1

C++이 훨씬 더 의미있게 만들었습니다. – jozefg

+0

엄밀히 말하면,'& x'는 *'x'의 주소가 아니지만 * * '연산자가 호출 되더라도'x '를 반환합니다. * address-of * :) – fredoverflow

+1

@FredOverflow : "객체 포인터 유형의 유효한 값은 메모리에있는 바이트의 주소 나 널 포인터를 나타냅니다." 나를 위해 충분히 가깝다. :) – GManNickG

5

변환이 아닙니다. 변수 유형이 T & 인 경우 T이 임의의 유형 인 경우 기본적으로 "다른 이름 또는 가능하지 않은 익명 값의 별칭 인 이름을 선언합니다."라고 말합니다. 포인터보다 typedef에 가깝습니다.

참고 문헌은 주소로 구현되는 경우가 많지만 실제로 무엇인지 생각하기에 좋은 모델은 아닙니다. 당신은 당황하고 당신의 예에서

:

int * const &y = &x; 

는 잘 작동합니다. 그런 다음 y은 주소가 x 인 임시 결과에 대한 별명이됩니다. 포인터에 대한 참조임을 알 수 있습니다. 그것은 임시 값에 대한 참조이기 때문에 상수 포인터에 대한 참조 여야합니다.

1

귀하의 문제는 &y은 단순히 주소가 아니라 참조입니다. 즉, x 사본처럼 동작합니다. 그것은 변환되지 않으며 실제로는 x의 또 다른 이름이되고 있습니다.

2

&y은 단순한 주소가 아니며 참조 용입니다. 이

int &y = x; 

y의 이름으로 x의 복제를 만드는 것을 의미한다.