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

+ Recent posts