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();
}
( 포인터처럼 작동하지 않는 객체에 *
, ->
오버로딩은 적절치 않다. )
(*num) = 30;
을 해석해보자
(num.operator*()) = 30;
으로 변환되고 오버로딩된 함수가 호출된다.
여기서 *
을 오버로딩할 때 반환형은 Number&
여야지 기존 *
연산에 벗어나지 않게 오버로딩할 수 있다.
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();
}