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)에서는 사용이 불가능합니다. 객체가 생성되기 전에 호출될 수 있기 때문입니다.

'프로그래밍 > C++' 카테고리의 다른 글

C++ 프렌드(friend)  (0) 2019.10.15
C++ 연산자 오버로딩(operator overloading)  (0) 2019.10.15
C++ this 포인터  (0) 2019.10.15
C++ const 멤버 함수  (0) 2019.10.15
C++ 생성자(constructor)와 파괴자(destructor)  (0) 2019.10.14
C++ 접근 제어자(Access Modifier)  (0) 2019.10.14
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기

댓글을 달아 주세요

">