swap含义及缺省实现
swap 函数是用来将两个对象的值彼此赋予对方。在缺省情况下,swap的动作可以由STL中提供的 swap 算法来完成,它的实现也很简单:
namespace std
{
template<typename T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
}
只要 T 支持拷贝构造和拷贝赋值, 缺省的 swap 就会为你完成置换 T 类型对象的工作。
我们可以看到,在这个缺省的实现中,我们进行了三次的拷贝动作,对于某些类型而言,这是必须的;但是对于一些含有指针数据成员的类型来说,这种做法明显会降低速度。这种情况最常见的就是 “ pimpl 手法”,也就是用一个指针去指向一个对象,在那个对象中存在真正的数据。比如说有下面的 Widget 类的实现:
class WidgetImpl {
public:
//...
private:
int a, b, c;
std::vector<double> v;
//...
};
class Widget
{
public:
Widget(const Widget& rhs)
{
//...
}
Widget& operator=(const Widget& rhs)
{
//...
}
//...