this 포인터
this->변수, 파이썬에서는 self.변수 등등 으로 this라는 놈은 OOP에서 상당히 자주 등장하는 개념이고 중요한 개념이다.
C의 포인터와 C++의 객체지향 개념을 이해하면 this라는 놈을 정확하게 알 수 있다. 상당히 귀여운 놈이다.
this 포인터는 클래스의 실제 인스턴스에 대한 주소를 가르키는 포인터다.
좀 더 풀어서 이야기하면 this는 포인터 변수인데, 실제 인스턴스의 주소를 값으로 가지는 변수이다.
#include <iostream>
using namespace std;
typedef struct USERDATA
{
int nAge;
char szName[32];
} USERDATA;
class CMYData
{
public:
CMYData(int nParam) : m_nData(nParam) {};
void PrintData()
{
// 인스턴스 a가 만들어질때는 this와 &a는 같은주소
// 인스턴스 b가 만들어질때는 this와 &b는 같은주소
cout << this->m_nData << endl;
cout << this->CMYData::m_nData << endl;
}
private:
int m_nData;
};
int main(void)
{
CMYData a(5), b(10);
a.PrintData();
b.PrintData();
return 0;
}
- CMYData 클래스 안의 PrintData 메소드는 this를 통해서 m_Data를 접근하고 있다. a.PrintData()를 Call 할 때 this는 &a와 같은 값을 가지고, b.PrintData()를 Call 할 때 this는 &b와 같은 값을 가진다. a.PrintData()는 사실 a.PrintData(&a)와 같다. 파라미터로 &a를 안넘겨도 되는 이유는 C++가 알아서 처리 해주기 때문이다(히든 파라미터라고 부름)
this의 실체
class CMYData
{
public:
CMYData(int nParam) : m_nData(nParam) {};
void PrintData(CMYData *pData)
{
CMYData* myThis = pData;
// myThis를 통해서 변수에 접근하고있다.
cout << myThis->m_nData << endl;
cout << myThis->CMYData::m_nData << endl;
}
private:
int m_nData;
};
int main(void)
{
CMYData a(5), b(10);
a.PrintData(&a);
b.PrintData(&b);
return 0;
}
이번에는 C++가 알아서 처리해주는 히든파라미터 말고 진짜로 주소값을 넘겨봤다. 주소 값이니깐 당연히 포인터를 써주고 그 포인터가 가르키는 대상은 CMYData이다.
'C++' 카테고리의 다른 글
C++ 깊은복사 얕은복사 (0) | 2020.02.02 |
---|---|
C++ 복사 생성자(참조형 파라미터) (0) | 2020.02.01 |
C에서 C++ 객체지향의 변환 과정 (0) | 2020.01.28 |
C++ 참조자 형식(reference) (0) | 2020.01.27 |
C++ new 메모리 동적할당 (0) | 2020.01.27 |