Namespaces
Variants

The this pointer

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

목차

구문

this

this 표현식은 prvalue expression 으로서, 그 값은 implicit object parameter (암시적 객체 멤버 함수가 호출되는 객체)의 주소입니다. 다음 상황에서 나타날 수 있습니다:

1) 모든 암시적 객체 멤버 함수 본문 내에서, 멤버 초기화 리스트 , 그리고 람다 표현식 본문 (C++11부터) 을 포함합니다.
2) 모든 암시적 객체 멤버 함수의 선언 내에서 (선택적) cv 한정자 시퀀스 이후의 모든 위치에서, 예외 명세 및 후행 반환 타입 (C++11부터) 을 포함하여.
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; }
};

키워드

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 가 비연관 클래스의 정적 멤버 함수에서
사용될 수 있는지 불명확했음
명확히 규정됨