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).member
은 ptr.member
과 동일한 의미 일 것이므로 혼동을 야기 할 수 있습니다.
C++에서는 그 차이가 언어에 유용합니다.스마트 포인터처럼 클래스 유형에 대해 operator->
을 오버로드 할 수 있습니다. 그러나 클래스 유형은 .
으로 액세스 할 수 있습니다. 따라서 some_smart_ptr->get();
은 "스마트 포인터의 참조에 get()
함수 호출"을 의미하는 반면 some_smart_ptr.get()
은 "스마트 포인터에 get()
함수 호출"을 의미합니다.
많은 속임수. 네, 참고입니다. –
나는 당신이 C++에 대해 조금 읽어야 할 것 같다. 단지 "C++ 참고 문헌"에 관한 인터넷 검색은 당신에게 훌륭한 문서와 개념에 대한 설명을 많이 줄 것이다. – dweeves