2012-10-19 2 views
-4

가능한 중복 : 나의 이해에서
What are the differences between pointer variable and reference variable in C++?
What does a function prototype mean with an ampersand in it?&에서 C++ 함수 인수 목록의 의미는 무엇입니까?

,

void bar(int &x) { ... } 

은 참조로 x을 통과 의미하는 것으로 보인다. 그러나 C++에는 이미 포인터 등이 있습니다. 그래서 차이점은 그 외에도이 더 있다고 ... 나는 또한 내가 두 번째 방법을 사용하는 경우, 나는이 struct에 전달하면 .에 반대 ->를 사용할 필요가 발견 사실에서

void bar(int *x) { ... } 
// then call by 
bar(&x); 

에있다 .. . 왜?

+1

많은 속임수. 네, 참고입니다. –

+1

나는 당신이 C++에 대해 조금 읽어야 할 것 같다. 단지 "C++ 참고 문헌"에 관한 인터넷 검색은 당신에게 훌륭한 문서와 개념에 대한 설명을 많이 줄 것이다. – dweeves

답변

3

Stroustrup이 C++에 대한 참조를 도입 한 이유는 연산자 오버로딩입니다.

귀하의 예제 기능 bar에서

http://www.stroustrup.com/bs_faq2.html#pointers-and-references

, 사용자가 bar(&x)로 호출 할 수 있는지 여부에는 큰 문제가 없다 (이 포인터를 필요하기 때문에) 또는 bar(x)로 호출 할 수 있습니다 (이 참조가 필요하기 때문에) . 적어도 C 프로그래머는 그렇지 않다고 생각합니다.

그러나 연산자 오버로드가 C++에 추가 된 경우 Stroustrup은 포인터가있는 오버로드 된 연산자를 사용하는 것이 매우 비 효과적이라고 생각했습니다 (단어에서 "못생긴").

참조에는 임시 객체를 const 참조에 바인딩 할 수 있다는 점 등 포인터에 대한 기능성에는 몇 가지 장점이 있지만이 경우 & 연산자를 적용 할 수 없습니다. 따라서 pass-by-const-reference 함수는 때때로 포인터를 전달하는 const에 해당하는 것과 비교하여 호출자에게 코드 라인을 저장합니다 (변수를 생성하기 위해).

이러한 이유로 포인터가 반환 될 때 나중에 사용할 수 있도록 함수가 주소를 저장하려고 할 때 포인터를 허용하고 그렇지 않은 경우 포인터를 받아들입니다. 매달려있는 포인터/참조를 만드는 모든 가능한 방법을 막지는 않지만 큰 포인터/참조를 잡습니다. 그것은 기능 스타일의 코드를 작성할 때 불행한 결과를 낳습니다.

두 번째 방법을 사용하면 나는 과 반대로 -> 사용해야합니다. 구조체에 전달하면 왜?

그냥 포인터 - 투 - 구조체를 통해 멤버에 액세스하려면 구조체의 ->를 멤버에 액세스 할 C. .로부터 상속 구문의

. C에서 을 사용하면 LHS에 포인터가있는 ->을 사용할 수 있으며 이 아닐 수 있습니다..에 LHS의 포인터가 사용됩니다. 따라서 다른 기호에 대한 엄격한 필요는 없으며 미리 알림을 포함하도록 코드를 읽기 쉽게 만듭니다. 예를 들어, 동일한 기호 .이 둘 다 사용 된 경우 (*ptr).memberptr.member과 동일한 의미 일 것이므로 혼동을 야기 할 수 있습니다.

C++에서는 그 차이가 언어에 유용합니다.스마트 포인터처럼 클래스 유형에 대해 operator->을 오버로드 할 수 있습니다. 그러나 클래스 유형은 .으로 액세스 할 수 있습니다. 따라서 some_smart_ptr->get();은 "스마트 포인터의 참조에 get() 함수 호출"을 의미하는 반면 some_smart_ptr.get()은 "스마트 포인터에 get() 함수 호출"을 의미합니다.

1

참조는 기본적으로 상수 주소가있는 포인터이므로 주소로 호출 할 때와 동일한 효과가 있습니다. 주로 문법의 차이입니다 : 참조로 호출하는 것이 호출 사이트에서 가치가있는 호출 인 것처럼 더 편리합니다 (임시 변수에주의해야한다는 점만 제외하고).

관련 문제