문제

나는이 질문에 대한 답을 읽고 있었다 C ++ 장단점 그리고 의견을 읽는 동안이 의심을 얻었습니다.

프로그래머는 종종 "이"가 포인터이지만 참조는 아니라는 것을 혼란스럽게 생각합니다. 또 다른 혼란은 "hello"가 std :: 문자열이 아니라 char const* (포인터) (포인터로 변환 한 후) - Johannes Schaub -Litb 12 월 22 '08 at 1:56으로 평가되는 이유입니다.

그것은 단지 다른 (나중에) 언어와 동일한 규칙을 사용하지 않는다는 것을 보여줍니다. - Le Dorfier 12 월 22 일 '08 at 3:35

그래도 나는 "이"를 꽤 사소한 문제라고 부릅니다. 그리고 죄송합니다. 정의되지 않은 행동의 예에서 몇 가지 오류를 포착 해 주셔서 감사합니다. :) 크기에 대한 정보가 첫 번째 정보와 어떤 관련이 있는지 이해하지 못합니다. 포인터는 단순히 할당 된 메모리 외부에서 지적 할 수 없습니다 - Jalf 12 월 22 일 4:18

이것은 끊임없는 시인입니까? - 예 RAAJ 12 월 22 일 6시 35 분

메소드가 const getfoo () const 인 경우 일정 할 수 있습니다. <- getfoo의 범위에서 "이것은"는 일정하므로 준비되어 있습니다. 이렇게하면 버그를 방지하고 발신자에게 객체가 변경되지 않는다고 어느 정도의 보증을 제공합니다. - Doug T. 12 월 22 일 '08 at 16:42

당신은 "이것"을 재 할당 할 수 없습니다. 즉, 당신은 "이것 = & 기타;"를 할 수 없습니다. 이것은 rvalue이기 때문입니다. 그러나 이것은 T 형 Const가 아닌 Type t*입니다. 즉, 그것은 불쾌한 포인터입니다. Const 방법에 있다면 Const에 대한 포인터입니다. t const. 그러나 포인터 자체는 먼저 - Johannes Schaub -Litb 12 월 22 '08 at 17:53

"this"를 다음과 같이 생각하십시오. #define this (this_ + 0)는 컴파일러가 객체에 대한 포인터로 "this_"를 작성하고 "this"를 키워드로 만듭니다. (this_ + 0)는 rvalue이기 때문에 "this"를 할당 할 수 없습니다. 물론 그게 방법이 아니지만 (매크로는 없음) 이해하는 데 도움이 될 수 있습니다 - Johannes Schaub -Litb 12 월 22 일 17:55

내 질문은 왜 그런지입니다 this 참조가 아닌 포인터? 포인터로 만드는 특별한 이유가 있습니까?


이유가 몇 가지 추가 논쟁 this 참조가되는 것은 의미가 있습니다.

  • 고려하다 Item 1 ~에서 More Effective C++: 참조를 사용하여 유효한 객체를 가지고 있음을 보장 할 때는 널 (내 해석)이 아닙니다.
  • 또한 참조는 포인터보다 안전한 것으로 간주됩니다 (길 잃은 포인터로 메모리를 망칠 수 없기 때문에).
  • 셋째, 참조에 액세스하기위한 구문 (.)는 포인터에 액세스하는 것보다 조금 더 좋고 짧습니다 (-> 또는 (*)).
도움이 되었습니까?

해결책

언어가 처음 진화했을 때 실제 사용자와 초기 릴리스에서 참조가 없었고 포인터 만있었습니다. 연산자 과부하가 추가 될 때 참조가 추가되었습니다. 참조는 일관되게 작동해야합니다.

사용 중 하나 this 대상이 자신에게 포인터를 얻는 것입니다. 참조라면 우리는 글을 써야합니다 &this. 반면에, 우리가 과제 연산자를 쓸 때 우리는 return *this, 그것은 더 간단하게 보일 것입니다 return this. 따라서 빈 슬레이트가 있다면 어느 쪽이든 논쟁 할 수 있습니다. 그러나 C ++는 사용자 커뮤니티 (가장 성공적인 것과 같은)의 피드백에 대한 응답으로 점차 진화했습니다. 후진 호환성의 가치는 사소한 장점/단점을 완전히 압도합니다. this 참조 또는 포인터

다른 팁

파티에 조금 늦게 ... 말의 입에서 바로, Bjarne Stroustrup이 말한 내용은 다음과 같습니다 ( "C ++의 디자인 및 진화"에서 본질적으로 반복되거나 취한 책) :

"이"가 참조가 아닌 이유는 무엇입니까?

"이"는 참조가 추가되기 전에 C ++ (클래스가있는 C로)에 도입 되었기 때문입니다. 또한, 나는 "자기"의 (나중에) 작은 토크 사용보다는 Simula 사용을 따르기 위해 "이것"을 선택했습니다.

C ++ 표준은이를 나타냅니다

9.3.2/1

비 종교적 (9.3) 멤 클래스 X의 멤버 함수에서 이것의 유형은 x*입니다. 멤버 함수가 const로 선언되면, 이것의 유형은 const x*입니다. 멤버 함수가 휘발성으로 선언되면 이것의 유형은 휘발성 x*이며 멤버 함수가 const 휘발성으로 선언되면 const입니다. 휘발성 x*.

그러나 다른 언급에서는 다른 것을 발견했습니다. 그래서 누군가가 주도권을 잡고 우편물을 쐈습니다. Mr. Stroustrup. 뒤 따르는 대화를 찾을 수 있습니다 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top