C++ this 포인터

프로그래밍/C++ 2019.10.15 댓글 Plorence

C++에서는 this라는 특별한 포인터가 제공됩니다.

오로지 클래스에서만 사용됩니다.

빠른 이해를 돕기 위해서 예제를 통하여 설명하겠습니다.

 

자신을 리턴해야 할때

#include <iostream>
class Person
{
private:
       int age;
public:
       Person(int p_age) { //파괴자
              age = p_age;
       }
       Person Clone();
};
Person Person::Clone() {
       return ? ? ; //뭐가 들어가야 할까?
}
int main(void) {
       Person per1 = Person(1);
       Person per2 = per1.Clone();
}

Person클래스의 멤버 함수 Clone은 자기 자신을 반환하려는 멤버 함수입니다.

근데 여기서 자기 자신을 가리키려면 어떻게 해야 할까요?

이 문제의 해결방법은 this 포인터를 사용하는 것입니다.

this 포인터는 멤버 함수를 호출하는 데 사용된 객체를 지시하고, 주소는 해당 객체의 주소로 설정합니다.

모든 클래스 멤버 함수들은 객체의 주소로 설정되는 하나의 this 포인터를 갖습니다.

 

this 포인터를 사용해 해결하기

#include <iostream>
class Person
{
private:
       int age;
public:
       Person(int p_age) { //파괴자
              age = p_age;
       }
       Person Clone();
};
Person Person::Clone() {
       return *this;
}
int main(void) {
       Person per1 = Person(1);
       Person per2 = per1.Clone();
}

this 포인터를 사용하게 되면 객체의 주소가 this이기 때문에 정상적으로 컴파일이 됩니다.

만약 *this를 하면 주소 값이 아니라 객체 자체가 됩니다.

this 포인터는 포인터이니 포인터 연산에서 가능한 것들은 this 포인터에서도 가능합니다.

 

멤버 변수의 이름과 매개변수(또는 지역변수)의 이름을 동일하게 짓고 싶을 때

#include <iostream>
class Person {
private:
       int a = 0;
       Person(int a = 1) {
              this->a = a;
       }
};

멤버 변수와 매개변수(또는 지역변수)의 이름이 같을 경우 멤버 변수는 이로 인해 가려지게 됩니다.

하지만 this포인터를 사용하면 객체의 멤버를 지시하게 되니 의도한 대로 멤버 변수 a를 지시할 수 있습니다.

 

this포인터의 제약

  • this포인터는 멤버 함수에서만 사용이 가능합니다.

  • 정적 멤버 함수(static member function)에서는 사용이 불가능합니다. 객체가 생성되기 전에 호출될 수 있기 때문입니다.

댓글