ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] this 포인터
    C++ 2019. 8. 29. 22:46

    this 포인터란?

    호출된 인스턴스 자신의 메모리 주소를 가리키는 포인터, 클래스의 내부에서 인스턴스들의 구분을 위해서 사용된다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
     
    using namespace std;
     
    class Simple
    {
    private:
        int m_id;
     
    public:
        Simple(int id)
        {
            setID(id);
            cout << "생성자에서 출력한 자신의 주소 : " << this << endl;
        }
     
        void setID(int id) { m_id = id; }
        int  getID() { return m_id; }
    };
     
    int main()
    {
        Simple s1(1);
        cout << "s1의 주소 : " << &s1 << endl;
        Simple s2(2);
        cout << "s2의 주소 : " << &s2 << endl;
    }
    cs

    this포인터가 가리키는 주소와 main함수에서 호출한 인스턴스의 주소

     

     

    this 포인터의 필요성

    각각이 별개로 구분되어야 하는 인스턴스들과 달리 클래스의 멤버 함수는 인스턴스마다 가지고 있는 것이 아니라 하나만 생성되어 인스턴스들끼리 공유해서 사용하는 것이 효율적이다.

    멤버 함수를 공유해서 사용하려면 어떤 인스턴스가 멤버 함수를 호출했는지 구분할 수 있어야 하는데 이때 사용되는 것이 this 포인터이다. 

     

    물론 평소에는 생략되어 있어 this 포인터를 사용하고 있는 것처럼 보이지는 않지만, 내부적으로는 this를 사용해서 클래스 내부의 멤버들을 처리한다. 아래의 코드를 보자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream>
     
    using namespace std;
     
    class Simple
    {
    private:
        int m_id;
     
    public:
        Simple(int id)
        {
            this->setID(id); // this 명시;
        }
     
        void setID(int id) { this->m_id = id; } // this 명시
        int     getID() { return this->m_id; } // this 명시
    };
     
    int main()
    {
        Simple s1(1);
        s1.setID(3); // 내부적으로는 Simple::setID(&s1, 3)와 같이 동작
     
        cout << s1.getID() << endl
    }
    cs

    main()함수의 s1.setID(3);라는 부분도 내부적으로는 Simple::setID라는 함수를 하나만 생성 해두고 이를 호출할 때 인스턴스의 주소와 함수의 인자를 넣어 인스턴스들을 구분할 수 있는 형태로 처리된다.

     

    이 외에도 this 포인터는 멤버 변수와 인자의 이름이 같을 때 구분하기 위해서 사용하기도 하고, *this를 리턴해서 멤버 함수를 연쇄 호출 하는 목적으로 사용하기도 한다.

     

     

     

     

     

    참고 자료

    https://www.inflearn.com/course/following-c-plus/lecture/14739 (인프런, 홍정모의 따라배우는 C++(8.7 this 포인터와 연쇄  호출))

     

Designed by Tistory.