swap function & copy-and-swap idiom

在C++中,众所周知在一个资源管理类(例如含有指向堆内存的指针)中需要重新定义拷贝构造函数、赋值运算符以及析构函数(Big Three),在新标准下还可能需要定义移动构造函数和移动赋值运算符(Big Five)。但实际上,这条规则还可以有一个小扩展。就是在资源管理类中,往往需要重新定义自己的swap函数来作为优化手段

1. swap函数

首先考察如下例子,假设类HasPtr中含有一个指向string的指针 *ps 和一个int类型值value。

复制代码
class HasPtr { public:
        ...
        ...
        ... private: string* ps; int value;
};
复制代码

则如果没有定义自己的swap函数的话,调用标准库的std::swap相当于进行如下动作: