练习13.29
解释swap(HasPtr&, HasPtr&)中对swap的调用不会导致递归循环。
解答:
inline void swap(HasPtr &lhs, HasPtr &rhs){
using std::swap;
swap(lhs.ps, rhs.ps);
swap(lhs.i, rhs.i);
}
这是swap的实现,这里不会产生递归调用。
这里swap重载了,在HasPtr中的swap调用中,不会再去调用自身。
因为,在HasPtr的swap函数中使用的是标准库中的swap函数。
练习13.30
为你的类值版本的HasPtr编写swap函数,并测试它。为你swap函数添加一个答应语句,指出函数什么时候执行。
解答:
inline
void swap(HasPtr &lhs, HasPtr &rhs)
{
std::cout << "call HasPtr's swap function." << std::endl;
using std::swap;
swap(lhs.ps, rhs.ps); // swap the pointers, not the string data
swap(lhs.i, rhs.i); // swap the int members
}
HasPtr f(HasPtr hp) // HasPtr passed by value, so it is copied
{
HasPtr ret = hp; // copies the given HasPtr
HasPtr cp;
swap(ret, cp); // will call HasPtr::swap
// process ret
return ret; // ret and hp are destroyed
}
练习13.31
为你的HasPtr类定义一个<运算符,并定义一个HasPtr的vector。为这个vector添加一些元素,并对它执行sort。注意何时会调用swap。
解答:
</pre><pre name="code" class="cpp">bool HasPtr::operator<(const HasPtr &rhs)
{
<span style="white-space:pre"> </span>if (*ps > *(rhs.ps)){
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (i > rhs.i){
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return true;
}
在我的执行结果里面,没有调用到swap(),不知道题目里面问“何时会调用swap”是什么意思。
练习13.32
类指针的HasPtr版本会从swap函数受益吗?如果会,得到了什么益处?如果不是,为什么?
解答:
这个会的,使用指针不用分配新的空间出来,节省了分配空间的时间。
同样,对类中使用inline也能作为优化的一种手段。
具体可以查看458页的一些内容(优化部分说的也不是很多)。