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


183

나는이 질문 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"는 상수이므로 읽기 전용입니다. 이렇게하면 버그가 방지되고 호출자가 개체가 변경되지 않는다는 일정 수준의 보증을 제공합니다. – 더그 티.

"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 (내 해석)이 보장 될 때 사용 참조 :.
  • 또한 참조는 포인터보다 안전한 것으로 간주됩니다 (왜냐하면 포인터가 길어지면 메모리를 망칠 수 없기 때문입니다).
  • 셋째, 참조 ( .) 에 액세스하기위한 구문은 포인터 ( ->또는 (*))에 액세스하는 것보다 약간 좋고 짧습니다 .

5
@paulm이 "해킹"은 실제로 무엇을 달성 할 것입니까? this항상 평가 되지 true않습니까?
iFreilicht

6
@ paulm 실제로 유효한 C ++이라고 생각하지 않습니다. nullptr에서 객체에 메소드를 호출하면 정의되지 않은 동작이 발생합니다.
antred

5
@paulm 어쩌면 어떤 경우에는 작동하지만 방법이 사소한 지 상상해보십시오. 객체없이 v-table 조회를 어떻게 수행 할 수 있습니까?
Jason Creighton

3
@paulm 프로덕션 코드에서 본 적이 있다면 배를 버려라! UB입니다.
Alice

6
난 그냥 여기에두고거야 ... (MFC의 afxwin2.inl에서) :_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
크리스토퍼 Oicles

답변:


176

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

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


4
글쎄, 종종 객체가 자신에 대한 참조를 얻는 것이 유용합니다. 나는 그것이 더 일반적인 사용법이라고 말하고 싶습니다. 어쨌든, 주된 이유는 당신이 말한 것처럼 'this'포인터를 만들 때 참조가 존재하지 않았다는 것입니다.
jalf

20
그리고 이것이 참조 인 경우 operator &유용한 것을 수행 하기 위해 과부하가 어려울 것 입니다. 이를 거치지 않는 주소를 얻으려면 특별한 구문이 있어야합니다 operator &.
Omnifarious

10
@conio-다음에 C ++ 컴파일러 근처에 있는지 확인하고 싶을 수도 있습니다! :) 같은 것 :int n = 5; int &r = n; int *p = &r; std::cout << *p;
Daniel Earwicker

14
@Omnifarious 당신은 &reinterpret_cast<char&>(this);과부하의 실제 주소를 얻기 위해 쓸 수 있습니다 operator&(사실, 이것은 일종의 것입니다 boost::addressof).
Johannes Schaub-litb

9
thisnull 이되는 것은 실제로 의미가 없으므로 참조가 실제로 더 적합하다고 생각됩니다.
Ponkadoodle

114

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

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

"this"는 참조가 추가되기 전에 C ++ (실제로 C 클래스)에 도입 되었기 때문입니다. 또한 " this나중에 Smallself" "self"를 사용하는 대신 Simula 사용법을 따르도록 " "를 선택했습니다 .


2
예, 자아는 다른 언어와 일관성을 유지하는 데 좋을 것입니다.
pilkch 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.