'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
'IT' 카테고리의 다른 글
문서로 해석되었지만 MIME 유형 application / zip으로 전송 된 자원 (0) | 2020.05.20 |
---|---|
CSS를 사용할 때 캔버스가 늘어나지 만 "너비"/ "높이"속성에서는 보통 (0) | 2020.05.20 |
X-SourceFiles 헤더는 무엇을합니까? (0) | 2020.05.20 |
부트 스트랩 그리드 시스템이있는 중첩 된 행? (0) | 2020.05.20 |
기록에서 삭제하지 않고 변경 사항 포기 (0) | 2020.05.20 |