C++Premier14.6节练习

练习14.27:

class StrBlobPtr
{
	friend bool operator==(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator!=(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator<(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator<=(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator>(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator>=(const StrBlobPtr&, const StrBlobPtr&);
public:
	StrBlobPtr() : curr(0) { }
	StrBlobPtr(StrBlob& a, size_t sz = 0) :wptr(a.data), curr(sz) { }
	std::string& deref() const;
	StrBlobPtr& incr();

	//递增递减运算符
	//前置版本
	StrBlobPtr& operator++();
	StrBlobPtr& operator--();

	//后置版本,为了使前置后置的重载版本无法区分,后置版本接受一个额外不被使用的int类型的形参
	//当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参
	StrBlobPtr& operator++(int);
	StrBlobPtr& operator--(int);

private:
	std::shared_ptr<std::vector<std::string>>check(std::size_t, const std::string&)const;
	std::weak_ptr<std::vector<std::string>>wptr;
	std::size_t curr;

};

//前置版本
StrBlobPtr& StrBlobPtr::operator++()
{
	//检查,如果curr已经指向容器的尾后位置,则无法递增它
	check(curr, "increment past end of StrBlobPtr");
	++curr;
	return *this;
}

StrBlobPtr& StrBlobPtr::operator--()
{
	//检查,如果curr已经指向容器的首位置,则无法递减它
	--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:

class StrBlobPtr
{
	friend bool operator==(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator!=(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator<(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator<=(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator>(const StrBlobPtr&, const StrBlobPtr&);
	friend bool operator>=(const StrBlobPtr&, const StrBlobPtr&);

	//指针算术
	friend StrBlobPtr operator+(const StrBlobPtr& sb, size_t n);
	friend StrBlobPtr operator-(const StrBlobPtr& sb, size_t n);
public:
	StrBlobPtr() : curr(0) { }
	StrBlobPtr(StrBlob& a, size_t sz = 0) :wptr(a.data), curr(sz) { }
	std::string& deref() const;
	StrBlobPtr& incr();

	//递增递减运算符
	//前置版本
	StrBlobPtr& operator++();
	StrBlobPtr& operator--();

	//后置版本,为了使前置后置的重载版本无法区分,后置版本接受一个额外不被使用的int类型的形参
	//当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参
	StrBlobPtr& operator++(int);
	StrBlobPtr& operator--(int);


private:
	std::shared_ptr<std::vector<std::string>>check(std::size_t, const std::string&)const;
	std::weak_ptr<std::vector<std::string>>wptr;
	std::size_t curr;

};

//指针加法运算
StrBlobPtr operator+(const StrBlobPtr& sb, size_t n)
{
	auto tmp_ret = sb;
	tmp_ret.curr += n;
	return tmp_ret;
}

//减法运算
StrBlobPtr operator-(const StrBlobPtr& sb, size_t n)
{
	auto tmp_ret = sb;
	tmp_ret.curr -= n;
	return tmp_ret;
}

练习14.29:

递增递减运算符会改变对象的状态,所以不能定义为const版本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学C++.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值