티스토리 뷰
programming language/C++
[ C++기초 ] Class 내 this 포인터와 Self-Reference 이해하기
무니웜테일패드풋프롱스 2020. 2. 18. 17:11
1. this 포인터
클래스 내에서, 해당 객체를 가리키는 포인터를 말한다. 따라서 this 포인터의 내부는 해당 객체의 '주소'로 이루어져 있다.
class Simple {
private:
int num;
public :
Simple(int n) : num(n) {
cout << "num= " << num << endl;
cout << "address= " << this << endl; //해당 객체의 주소 반환
}
Simple* GetThisPointer() {
return this; //this pointer 반환
}
void ShowSimple() {
cout << "num= " << num << endl;
}
};
int main(void) {
Simple sim(100); //객체 생성
Simple* ptr = sim.GetThisPointer(); //this 포인터를 포인터변수 ptr에 저장
cout << ptr << endl; //객체 sim의 주소 반환
ptr->ShowSimple(); //포인터형식으로 해당 객체에 접근 가능
return 0;
}
따라서, 클래스 외부에서 객체 포인터 변수에 특정 객체의 this 포인터를 반환하여 저장하면, 그 포인터 변수 (여기서는 ptr)에는 그 객체의 '주소'가 저장되고, ptr 포인터 변수를 통해서 멤버함수 접근이 가능해진다.
2. Self-Reference
Self-Reference는 말그대로, 외부에서 객체에 대한 '참조자'를 생성하는 것이다. 이 참조자는 결국 해당 객체를 '참조'하기 때문에, 객체와 '동일하게' 멤버함수에 대한 접근이 가능해진다.
this 포인터를 객체 포인터변수에 저장하면 그 객체의 '주소'를 가리키는 '포인터 변수'가 된 것과 달리,
this 포인터를 참조자에 반환하여 저장하면, 참조자는 그 객체를 '참조'하게 되는 것이다.
class SelfRef {
private :
int num;
public:
SelfRef(int n) : num(n)
{
cout << "객체생성: "<<num<< endl;
}; //객체 생성
SelfRef& Adder(int n) {
num += n;
return *this; //this 포인터를 이용해 참조 값 반환
}
SelfRef& ShowTwoNumber() {
cout << num << endl;
return *this; //this 포인터를 이용해 참조값 반환
}
};
int main(void) {
SelfRef obj(3); //객체 생성
SelfRef& Ref = obj.Adder(2); //객체 참조자 &Ref에 obj 객체 참조정보 저장됨
Ref.ShowTwoNumber(); //참조자로서 객체와 동일하게 멤버함수 접근 가능
obj.ShowTwoNumber();
Ref.Adder(2).ShowTwoNumber().Adder(3).ShowTwoNumber();
//참조정보 반환의 극단적인 예시
//멤버함수 Adder와 ShowTwoNumber모두 참조정보를 반환하기 때문에
//계속해서 반환받는 참조정보로 해당 객체 멤버함수에 접근 가능
Ref.ShowTwoNumber();
obj.ShowTwoNumber();
return 0;
}
댓글