this
포인터는 객체 자신을 가리키는 포인터이다. 때문에 this
키워드는 클래스 멤버 함수 내에서만 사용이 가능하다. 또한 static
멤버 함수 내에서는 사용이 불가능하다. static
멤버 함수는 객체 생성 전에도 존재하기 때문에 this
포인터가 가리키는 객체가 없을 수 있기 때문이다.
class Test {
private:
int mNum;
public:
Test() : mNum(0) {}
Test(int num) : mNum(num) {}
void SetNum(int num) { mNum = num; }
~Test() {}
Test& ReturnSelf() { return *this; }
// *this - 주소값이 아닌 객체 자신을 반환
// 임시 객체를 생성하지 않기 위해 레퍼런스로 반환
};
int main() {
Test t;
t.SetNum(1);
}
만약 멤버 변수와 멤버 함수의 매개 변수의 이름이 동일할 때, this
를 명시해야 된다.
void SetNum(int mNum) { this->mNum = mNum; }
// this->mNum : 멤버 변수, mNum : 매개 변수
t.SetNum(1);
멤버 함수 SetNum
은 인자가 1개지만 컴파일될 때 아래처럼 변환되어 매개 변수가 추가된다.
t.SetNum(&t, 1)
매개 변수가 추가되어 멤버 함수인 SetNum
도 컴파일 시 아래처럼 변환된다.
void SetNum(Test* const this, int num)
이처럼 this
포인터는 멤버 함수를 호출한 객체 자신의 주소를 가리키게 되고, 컴파일 시 멤버 함수 안의 멤버 변수 앞에 this->
가 붙는다.