The
this
pointer
목차 |
구문
this
|
|||||||||
this 표현식은 prvalue expression 으로서, 그 값은 implicit object parameter (암시적 객체 멤버 함수가 호출되는 객체)의 주소입니다. 다음 상황에서 나타날 수 있습니다:
|
3)
default member initializer
내부에서.
4)
capture list
내부에서.
|
(since C++11) |
설명
this 는 해당 표현이 문맥상 유효하지 않은 경우에도, 오직 그것이 나타나는 가장 안쪽의 둘러싸는 클래스와만 연관될 수 있습니다:
class Outer { int a[sizeof(*this)]; // 오류: 멤버 함수 내부가 아님 unsigned int sz = sizeof(*this); // OK: 기본 멤버 초기화 식에서 사용 void f() { int b[sizeof(*this)]; // OK struct Inner { int c[sizeof(*this)]; // 오류: Inner의 멤버 함수 내부가 아님 // "this"는 Outer와 연관되지 않음 // Outer의 멤버 함수 내부에 있더라도 }; } };
클래스
X
의 멤버 함수 내에서
this
의 타입은
X*
(X에 대한 포인터)입니다. 만약 멤버 함수가
cv-qualifier 시퀀스
cv
로 선언된 경우,
this
의 타입은
cv
X*
(동일하게 cv-qualified된 X에 대한 포인터)입니다. 생성자와 소멸자는 cv-qualifier로 선언될 수 없으므로, 이들 내부에서
this
의 타입은 const 객체를 생성하거나 파괴할 때조차도 항상
X*
입니다.
클래스 템플릿에서, this 는 종속 표현식(dependent expression) 이며, 명시적 this - > 을 사용하여 다른 표현식을 종속 표현식으로 강제할 수 있습니다.
template<typename T> struct B { int var; }; template<typename T> struct D : B<T> { D() { // var = 1; // 오류: "var"이 이 범위에서 선언되지 않았습니다 this->var = 1; // 정상 } };
객체 생성 과정에서 객체의 값이나 그 하위 객체들의 값이 생성자의 this 포인터로부터 직접적 또는 간접적으로 얻어지지 않은 glvalue를 통해 접근되는 경우, 이렇게 얻어진 객체나 하위 객체의 값은 지정되지 않습니다. 다시 말해, 생성자 내에서 this 포인터는 별칭화(aliased)될 수 없습니다:
extern struct D d; struct D { D(int a) : a(a), b(d.a) {} // b(a) 또는 b(this->a)가 올바름 int a, b; }; D d = D(1); // b(d.a)가 this를 통해 a를 얻지 않았으므로, d.b는 현재 미지정 상태임
delete this
;
를 실행하는 것이 가능합니다. 단, 프로그램이 해당 객체가
new
로 할당되었다는 것을 보장할 수 있는 경우에 한합니다. 그러나 이는 할당 해제된 객체를 가리키는 모든 포인터를 무효화하며, 여기에는
this
포인터 자체도 포함됩니다:
delete this
;
가 반환된 후에는, 해당 멤버 함수가 클래스의 멤버를 참조할 수 없으며(이는
this
의 암시적 역참조를 수반하기 때문), 다른 어떤 멤버 함수도 호출될 수 없습니다.
이는 참조 카운팅 포인터의 멤버 함수에서 사용될 수 있습니다 (예를 들어, std::shared_ptr ) (C++11부터) 관리 객체에 대한 마지막 참조가 범위를 벗어날 때, 참조 카운트를 감소시키는 역할을 담당합니다.
class ref { // ... void incRef() { ++mnRef; } void decRef() { if (--mnRef == 0) delete this; } };
키워드
예제
class T { int x; void foo() { x = 6; // this->x = 6;와 동일함 this->x = 5; // this->의 명시적 사용 { void foo() const { // x = 7; // 오류: *this는 상수임 } void foo(int x) // 매개변수 x가 동일한 이름의 멤버를 가림 { this->x = x; // 한정되지 않은 x는 매개변수를 참조함 // 명확성을 위해 "this->"가 필요함 } int y; T(int x) : x(x), // 멤버 x를 초기화하기 위해 매개변수 x 사용 y(this->x) // 멤버 y를 초기화하기 위해 멤버 x 사용 {} T& operator=(const T& b) { x = b.x; return *this; // 많은 오버로드된 연산자들이 *this를 반환함 } };
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 760 | C++98 |
중첩 클래스에서
this
가 사용될 때,
이것이 중첩 클래스와 연관되는지 외부 클래스와 연관되는지 명시되지 않음 |
this
는 항상 가장 안쪽의
중첩 클래스와 연관되며, 비정적 멤버 함수 내에 있는지 여부와 무관함 |
| CWG 2271 | C++98 |
this
는 비 const 객체를
생성할 때 별칭이 지정될 수 있었음 |
이 경우에도 별칭 지정이
금지됨 |
| CWG 2869 | C++98 |
this
가 비연관 클래스의 정적 멤버 함수에서
사용될 수 있는지 불명확했음 |
명확히 규정됨 |