[11-3] 포인터 연산자 오버로딩

dd_ddong·2022년 8월 14일
0

c++

목록 보기
35/38
class Number
{
private:
	int num;
public:
	Number(int n) :num(n) {}
	void ShowData() { cout << num << endl; }
	Number& operator*()
	{
		return *this;
	}
	Number* operator->()
	{
		return this;
	}
};

int main()
{
	Number num(20);
	
	(*num) = 30;

	num->ShowData();


}

( 포인터처럼 작동하지 않는 객체에 *, -> 오버로딩은 적절치 않다. )

operator*

(*num) = 30;을 해석해보자
(num.operator*()) = 30;으로 변환되고 오버로딩된 함수가 호출된다.
여기서 *을 오버로딩할 때 반환형은 Number& 여야지 기존 *연산에 벗어나지 않게 오버로딩할 수 있다.

operator->

num->ShowData();을 해석해보자
->연산은 오버로딩 했다고 하면 다음과 같이 변환된다고 약속되있다.
(num.operator->())->ShowData();
이와 같이 변환되려면 오버로딩 시 포인터가 반환되는 것이 필수이다.
따라서 오버로딩 시 반환형은 Number*로 고정이다.

스마트 포인터

포인터 역할을 하는 객체 (+ 추가 기능)

class Smartptr
{
private:
	Point* posptr;
public:
	Smartptr(Point* ptr) : posptr(ptr)
	{

	}
	Point& operator*()
	{
		return *posptr;
	}
	Point* operator->()
	{
		return posptr;
	}
	~Smartptr()
	{
		delete posptr;
	}
};

동작하는 걸 보면 포인터와 같지만 메모리 자동 해제 기능이 추가되었다.

int main()
{
	Smartptr ptr1(new Point(1, 2));
	Smartptr ptr2 = new Point(3, 4);

	(*ptr1).ShowData();
	ptr2->ShowData();

}

0개의 댓글