14.6 成員訪問操作符
箭頭操作符必須定義為類成員函數。解引用操作符不要求定義為成員,但將它作為成員一般也是正確的。
1. 構建更安全的指針
class ScrPtr
{
friend class FooPtr;
size_t use;
Foo *f;
ScrPtr(Foo *foo):f(foo),use(1){}
~ScrPtr()
{
delete f;
}
};
class FooPtr
{
public:
FooPtr(Foo *f):ptr(new ScrPtr(f)){}
~FooPtr()
{
if(--ptr->use==0)
delete ptr;
}
FooPtr(const FooPtr &fptr):ptr(fptr.ptr)
{
++ptr->use;
}
FooPtr &operator=(const FooPtr &fptr);
private:
ScrPtr *ptr;
};
2. 支持指針操作
Foo &operator*()
{
return *(ptr->f);
}
Foo *operator->()
{
return ptr->f;
}
const Foo &operator*() const
{
return *(ptr->f);
}
const Foo *operator->() const
{
return ptr->f;
}
3. 重載解引用操作符
像下標操作符一樣,我們需要解引用操作符的const和非const版本。它們的區別在於返回類型:const成員返回const引用以防止用戶改變基礎對象。
4. 重載箭頭操作符
箭頭操作符與眾不同,它可能表現得像二元操作符一樣。這裡沒有第二個形參,因為->的右操作數不是表達式,相反,是對應著類成員的一個標識符。沒有明顯可行的途徑將一個標識符作為形參傳遞給函數,相反,由編譯器處理獲取成員的工作。
重載箭頭操作符必須返回指向類類型的指針,或者返回定義了自己的箭頭操作符的類類型對象。
摘自 xufei96的專欄