IT

'this'가 왜 포인터가 아닌 포인터입니까?

lottoking 2020. 5. 20. 08:07
반응형

'this'가 왜 포인터가 아닌 포인터입니까?


나는이 질문 C ++ 장단점에 대한 답변을 읽었으며 의견을 읽는 동안이 의심을 얻었습니다.

프로그래머는 종종 "this"가 포인터이지만 참조가 아니라고 혼동합니다. 또 다른 혼란은 "hello"가 std :: string 유형이 아니지만 char const * (포인터)로 평가되는 이유입니다 (배열에서 포인터로 변환 한 후) – Johannes Schaub-litb

그것은 다른 언어와 같은 규칙을 사용하지 않는다는 것을 보여줍니다. – le dorfier 12 월 22 '08시 3:35

나는 "이것"을 아주 사소한 문제라고 부릅니다. 그리고 죄송합니다. 정의되지 않은 동작의 예에서 몇 가지 오류를 잡아 주셔서 감사합니다. :) 크기에 대한 정보가 첫 번째 정보와 관련이 있는지 이해하지 못합니다. 포인터는 단순히 할당 된 메모리 외부를 가리킬 수 없습니다. – jalf Dec 22 '08 at 4:18

이것은 지속적인 poiner입니까? – yesraaj 12 월 22 '08시 6:35

메소드가 const 인 경우 상수 일 수 있습니다. int getFoo () const; <-getFoo의 범위에서 "this"는 상수이므로 읽기 전용입니다. 이렇게하면 버그가 방지되고 호출자가 개체가 변경되지 않는다는 일정 수준의 보증을 제공합니다. – Doug T. 12 월 22 일 08시 16:42

"this"를 재 할당 할 수 없습니다. 즉,이 값은 rvalue이므로 "this = & other;"를 수행 할 수 없습니다. 그러나 이것은 T const 유형이 아닌 T * 유형입니다. 즉, 일정하지 않은 포인터입니다. const 메소드에 있다면 const에 대한 포인터입니다. T const. 그러나 포인터 자체는 불변이다 – Johannes Schaub-litb 12 월 22 '08시 17:53

"this"를 다음과 같이 생각하십시오 : # 컴파일러가 "this_"를 객체에 대한 포인터로 생성하고 "this"를 키워드로 만드는 this (this_ + 0)를 정의하십시오. (this_ + 0)이 rvalue이므로 "this"를 할당 할 수 없습니다. 물론 그것은 그 방법이 아닙니다 (그런 매크로는 없습니다), 그러나 그것을 이해하는 데 도움이 될 수 있습니다 – Johannes Schaub-litb Dec 22 '08 at 17:55

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


this참조가되는 이유 에 대한 몇 가지 추가 주장 :

  • 고려 Item 1에서 More Effective C++우리가 유효한 개체 즉이 아닌 NULL (내 해석)이 보장 될 때 사용 참조 :.
  • 또한 참조는 포인터보다 안전한 것으로 간주됩니다 (왜냐하면 포인터가 길어지면 메모리를 망칠 수 없기 때문입니다).
  • 셋째, 참조 ( .) 에 액세스하기위한 구문은 포인터 ( ->또는 (*))에 액세스하는 것보다 약간 좋고 짧습니다 .

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

용도 중 하나 this는 객체가 자신에 대한 포인터를 얻는 것입니다. 참조라면을 작성해야합니다 &this. 다른 한편으로, 할당 연산자를 작성할 때는으로 return *this간단하게 보일 것 return this입니다. 따라서 빈 슬레이트가 있다면 어느 쪽이든 논쟁 할 수 있습니다. 그러나 C ++은 사용자 커뮤니티 (가장 성공적인 것들)의 피드백에 따라 점진적으로 발전했습니다. 이전 버전과의 호환성의 가치는 this참조 또는 포인터 에서 비롯된 사소한 장점 / 단점을 완전히 압도합니다 .


파티에 조금 늦게 ... 말의 입에서 곧장, 여기에 Bjarne Stroustrup의 말이 있습니다 ( "C ++의 디자인과 진화"책에서 본질적으로 반복되거나 인용됩니다) :

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

"this"는 참조가 추가되기 전에 C ++ (실제로 C 클래스)에 도입 되었기 때문입니다. 또한, 나는 "나중에"selftalk의 스몰 토크 사용보다는 Simula 사용을 따르기 위해 "this"를 선택했습니다.


C ++ 표준에 따르면

9.3.2 / 1

비 정적 (9.3) 멤버 함수의 본문에서 키워드 키워드는 함수가 호출되는 객체의 주소 인 값이 아닌 값이 아닌 표현식입니다. 클래스 X의 멤버 함수에서이 유형은 X *입니다. 멤버 함수가 const로 선언 된 경우이 유형은 const X *이고 멤버 함수가 일시적으로 선언 된 경우이 유형은 휘발성 X *이며 멤버 함수가 const volatile로 선언 된 경우이 유형은 const입니다 휘발성 X *.

그러나 다른 참고 문헌에서, 그것은 다른 무엇인가 발견되었다. 그래서 누군가는 주도권을 잡고 Stroustrup 에게 메일을 쏘았다 . 다음 대화는 여기 에서 찾을 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/645994/why-is-this-a-pointer-and-not-a-reference

반응형