练习14.27 为你的StrBlobPtr类添加递增和递减运算符。
StrBlobPtr& StrBlobPtr::operator++()
{
check(curr, "increment past end of StrBlobPtr");
++curr;
return *this;
}
StrBlobPtr& StrBlobPtr::operator--()
{
--curr;
check(curr, "decrement past begin of StrBlobPtr");
return *this;
}
StrBlobPtr StrBlobPtr::operator++(int)
{
StrBlobPtr ret = *this;
++*this;
return ret;
}
StrBlobPtr StrBlobPtr::operator--(int)
{
StrBlobPtr ret = *this;
--*this;
return ret;
}
练习14.28 为你的StrBlobPtr类添加加法和减法运算符,使其可以实现指针的算术运算(106页)。
StrBlobPtr operator+(StrBlobPtr &data, std::size_t n)
{
data.curr += n;
data.check(curr, "increment past end of StrBlobPtr");
return *this;
}
StrBlobPtr operator-(StrBlobPtr &data, std::size_t n)
{
data.curr -= n;
data.check(curr, "decrement past begin of StrBlobPtr");
return *this;
}
练习14.29 为什么不定义const版本的递增和递减运算符。
显然,递增递减改变了对象状态,不能定义为常量运算符。
14.30 为你StrBlobPtr类在练习12.22中定义的ConstrStrBlobPtr类分别添加解引用运算符和箭头运算符。注意:因为ConstStrBlobPtr的数据成员指向const vector,所以ConstStrBlobPtr中的运算符必须返回常量引用。
std::string& StrBlobPtr::operator*()const
{
auto p = check(curr, "dereference past end");
return (*p)[curr];
}
std::string* StrBlobPtr::operator->()const
{
return &this->operator*();
}
const std::string& ConstStrBlobPtr::operator*() const
{
auto p = check(curr, "deference past end");
return (*p)[curr];
}
const std::string* ConstrStrBlobPtr::operator->() const
{
return &this->operator*();
}
14.31 我们的StrBlobPtr类没有定义拷贝构造函数、赋值运算符及析构函数,为什么?
StrBlobPtr是弱共享的智能指针,只需默认的拷贝构造函数和赋值运算符。
智能指针有自动销毁的功能等同于析构函数。
14.32 定义一个类令其含有指向StrBlobPtr对象的指针,为这个类定义重载的箭头运算符。
class StrBlobPtrs {
public:
StrBlobPtr& operator*()const
{
return *p;
}
StrBlobPtr* operator->()const
{
return &this->operator*();
}
private:
StrBlobPtr *p;
};