본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] this 포인터

by 심찬 2021. 8. 24.

 

 

this 포인터

 

 - 멤버 함수 안에서 사용가능한 키워드

 - 자신을 호출한 객체의 주소를 담고 있다.

 

객체를 여러 개 생성 할 때

멤버 데이터는 객체당 한 개씩 메모리에 놓이게 된다.

멤버 함수는 객체의 개수에 상관없이 코드 메모리에 한 개만 있다.

 

 

#include <iostream>

class Point
{
    int x = 0;
    int y = 0;
public:
    void set(int a, int b)
    {
        std::cout << this << std::endl;
        x = a; 
        y = b; 
    }
};
int main()
{
    Point p1;
    Point p2;
    
    p1.set(10, 20);
    p2.set(30, 40);    
    
    std::cout << &p1 << std::endl;
    std::cout << &p2 << std::endl;
}

위와 같은 코드에서 p1과 p2 객체가 각각 생성될 때, 아래와 같은 메모리 구조(p1과 p2 각각)가 생성된다.

p1.set(10, 20); 이 호출되었을 때, set 함수는 메모리에 하나 밖에 없는데 앞에 (p1이 써 있지만, 전달되는 인자는 2개 뿐인데) 어떻게 p1과 p2 메모리 위치를 구별할 수 있을까?

 -> 실제로는 두 개의 인자뿐아니라 p1의 주소까지 함께 전달이 된다.

 -> set(&p1, 10, 20) 과 같은 형태로 불리는 것이다.

 -> 눈에는 보이지 않지만 실제 this가 사용된다.

void set (Point* this, int a, int b)
{
	this->x = a;
	this->y = b;
}

 

 

this 포인터 활용

 

(1) this를 사용하면 멤버에 접근할 수 있다.

 - 이름 충돌 시 멤버의 이름과 지역변수(함수인자)의 이름이 동일할 때 지역변수가 우선시 된다.

 

#include <iostream>

class Point
{
    int x = 0;
    int y = 0;
public:
    //Point* set(int x, int y)     // return this;   
    Point& set(int x, int y)
    {
        this->x = x;   
        this->y = y; 
        
        return *this;
    }
};
int main()
{
    Point p1;
    //p1.set(10,20)->set(30,40)->set(40,50);   // 포인터를 반환하면 "->" 사용가능
    p1.set(10,20).set(30,40).set(40,50);
    
    
    // cout의 원리가 this를 반환하는 방식!
    //cout << "A" << "B" << "C";
}

 

(2) this를 반환하는 함수

 - this 또는 *this를 반환하면 멤버 함수를 연속적으로 호출할 수 있다.

 - cout 의 원리가 반환값으로 자기 자신을 반환하는 것이다.

 

주의! 

  *this를 반환할 때 아래와 같이 Point가 반환값이 되면 임시객체가 생성되기 때문에 참조를 반환해야 한다.

    Point set(int x, int y) 
    {
        return *this;
    }

 

this 포인터 주의사항

 

this pointer가 static member 함수에서는 사용할 수 없다.

static 함수는 객체가 없어도 생성이 되어 있을 수 있기 때문에 this 사용이 불가한 것이다.

#include <iostream>

class Test
{
public:
    static void foo()
    {
        std::cout << this << std::endl;
    }
};

int main()
{
	// foo()를 호출하는 첫번째 방법
    Test::foo();
    
    // foo()를 호출하는 두번째 방법
    Test t;
    t.foo();
}

main.cpp:8:22: error: ‘this’ is unavailable for static member functions

 

댓글