2012-05-19 5 views
1

독립적 인 참조가 존재하고 앨리어싱처럼 작동하는 좋은 C++ 튜토리얼을 읽었습니다. 그러나 ... 그것이 무엇을 위해 만들어 졌는지 궁금합니다. 왜 앨리어싱을 사용해야할까요?C++ 독립 참조 - 무엇을 위해?

게다가, 나에게 명확하지 않다 코드의 일부 조각 :

int a; 
int &ref = a; // independent reference 
int b = 19; 
ref = b; 
cout << a << " " << ref << "\n"; 
ref--; 
cout << a << " " << ref << "\n"; 

첫째, 심판은에 '참조'입니다. 필자는 ref의 주소 (따라서 앰퍼스 헤드)가 다음과 같은 두 번째 코드 줄에서 알 수 있습니다. 그런 다음 정수 ref에 b (19) 값이 할당됩니다. 첫 번째 cout은 a와 ref를 반환하며 둘 다 19와 같습니다. 왜? 정수가 ref의 주소가 아닌가? 그런 다음 ref를 감소시키고 마지막 cout은 두 번을줍니다 18. a와 ref는 감소합니다.

수수께끼에 대한 이상한 해석이 있습니다 : 여기 int & 자체는 하나의 유형이며, '정수에 대한 독립적 인 참조'이며이 유형은 앨리어싱을 의미합니다. 그러면 당신이 심판하기 위해 무엇을 하든지, 같은 일이 행해진 다.

맞습니까? 하지만 왜 앨리어싱이 필요합니까?

답변

3

정확합니다. 참조 (예 : 참조의 값을 수정 원래 수정) 많은 안부에서 const를 포인터와 비슷합니다 그리고 당신은 아무것도하지만, 초기 변수에 대한 참조를 바인딩 할 수 없습니다, 그러나 null 수 없으며 그것을 사용하는 구문 참조가 필요하지 않습니다 (*, ->)). 포인터가 아니기 때문에 가장 좋은 설명은 별칭입니다. 동일한 변수에 대해 다른 이름으로 생각하십시오.

또한 함수 매개 변수로 참조를 전달하면 변수의 복사본이 만들어지지 않으며 (포인터와 값을 가리키는 것처럼) 참조에 대한 변경 사항은 원래 변수에 반영됩니다.

const 참조가 범위를 벗어날 때까지 임시 값이 일반 수명을 초과하여 살아갈 수 있도록하는 특별한 참조 규칙이 있습니다.

+0

참조는 임시 포인터의 수명 연장에 대한 특별한 규칙을 제외하고는 'const'포인터와 같이 작동합니다. –

+0

@BenVoigt : null이 아니며, 더 좋은 사용법이 보장됩니다. ..., –

+0

@BenVoigt - thx, 업데이트 – Attila

2

귀하의 예에서는별로 의미가 없습니다. 그러나이 사항을 고려하십시오

int & ri = expensive_function_call(args)->some_map[calculate_the_key()].first; 
if (ri > 6) ri = 6; 

대 물론

if (expensive_function_call(args)->some_map[calculate_the_key()].first > 6) 
    expensive_function_call(args)->some_map[calculate_the_key()].first = 6; 

을, 당신은 포인터를 사용할 수도 : 별칭 (참조 또는 포인터)를 사용하여

int * pi = &expensive_function_call(args)->some_map[calculate_the_key()].first; 
if (*pi > 6) *pi = 6; 

을뿐만 아니라 인 코드가 거의 절반으로 줄어들지 만 프로그램이 실행될 때 수행해야하는 작업도 절반으로 줄었습니다 (최소한 컴파일러가 최적화를 시작하기 전에는).

3

그런 다음 ref를 수행 할 때도 마찬가지입니다. 그것은 보는 꽤 정확한 방법을의

. 본질적으로 refa은 모두 int을 나타냅니다.

왜 하나 앨리어싱을 필요로 하는가? 참조

한 매우 일반적으로 사용되는 함수에 인수를 전달입니다. 다음 고려 :

void f(const HugeStruct& data) { 
... 
} 

이 싸게 발신자와 포인터를 사용할 때보 다 더 좋은 구문으로 HugeStruct을 전달하는 호출 할 수 있습니다.

2

두 번째 코드 줄부터 ref (앰퍼샌드) 주소는 a입니다. 그런 다음 정수 ref에 b 값이 할당됩니다.

참조가 작동하는 방식을 이해하지 못합니다.

int a; 
int &ref = a; 

첫 번째 줄에는 int 개체가 할당됩니다. 이 객체는 로컬 변수 a을 사용하여 참조 할 수 있습니다.

두 번째 줄은 을 동일한 int 개체의 별칭으로 만드는 효과가 있습니다. a 또는 ref을 사용하여 개체를 변경할 수 있지만 하나만 int 개체가 있습니다.

1

귀하의 질문에 근본적인 거짓 진술이 많이 있기 때문에 C++에 관한 좋은 책을 사서 읽고 읽어야합니다.

먼저, a는 ref의 주소가 아닙니다. 첫 번째 코드 줄에서 & 연산자를 사용하는 경우 int &ref = a ref의 주소를 a으로 설정하지 않았습니다. 기존 정수에 대한 별명 인 새 변수를 작성합니다. 즉, a에 대한 명시 적 참조입니다. 이것은 자체 연산자/연산이며 주소 나 포인터와는 아무런 관련이 없습니다 (실제로는 아님).

이후에 언제든지 ref을 읽거나 쓰면 마치 a. ref은 이제 a을 말하는 또 다른 방법이며 주소를 얻는 것을 포함하여 사용자가 수행하는 모든 작업은 에서 a으로 전달됩니다.

+2

"새 정수를 생성 중입니다." 아니요, 기존 정수에 대한 참조를 작성 중입니다. –

+0

@DavidHeffernan : 문구가 꺼져있을 수 있습니다 ('새 정수'를 '새 참조'또는 '새 별칭'으로 바꾸십시오). 그러나 요점은 그것이 주소와 아무 관련이 없다고 주장한다. –

+2

나는이 아이디어를보다 분명하게 설명하기 위해 문구를 수정했다. 감사합니다 @ 데이비드, 그리고 로키. –

1

함수 호출이 관련되지 않은 경우에도 alises에 대한 유용한 용도가 있습니다.

당신은 고통 (오류가 발생하기 쉬운이!) 내가 그 정수 값을 사용하고자 할 때마다 그 밖으로 철자해야하는 것입니다 이름을

MyComplicatedStruct x; 
int &ref = x.array[17].anotherarray[3]; 
// Do stuff with 'ref' 

을 단순화하는 데 사용할 수 있습니다.

또 다른 예 :

int myFirstValue = 1; 
int MyOtherValue = 2; 

while(true) { 
    int &value = (SomeComplicatedTest() ? myFirstValue : myOtherValue); 
    // do stuff with 'value' 
} 

이는 것이 고통 (오류가 발생하기 쉬운)은 기준없이 할 수 있습니다.

관련 문제