13.3 交换操作 | swap

交换操作

除了定义拷贝控制成员,管理资源的类通常还定义一个swap函数。对于和重排元素顺序的算法一起使用的类,定义swap非常重要。

如果一个类未定义swap则算法将使用标准库定义的版本。
交换值的swap需要临时变量:

T temp = v1;
v1 = v2;
v2 = temp;

交换指针的则不必浪费临时变量的内存分配,以HasPtr为例:

string* temp = v1.ps;
v1.ps = v2.ps;
v2.ps = v1.ps;

可以编写类外的swap,将其定义为类的友元以访问private的数据成员。

由于swap就是为了优化代码,可以将其声明为inline函数。

swap函数应该调用swap,而不是std::swap

即使使用了using std::swap,在定义了swap的作用域中该自定义的swap的匹配优先级依然高于std::swap。

在赋值运算符中使用swap

定义了swap的类通常使用swap定义他们的赋值运算符。这些运算符使用了一种名为 拷贝并交换(copy and swap) 的技术,将lhs与rhs运算对象的一个副本进行交换,因此该版本的赋值运算符参数并非引用而是传值。

HasPtr& HasPtr::operator=(HasPtr rhs){
    swap(*this, rhs);
    return *this;
}
离开作用域后,rhs指向的新的位置会被析构进而销毁。

该技术自动处理了自赋值情况,且天然具有安全性。代码中唯一可能抛出异常的是拷贝构造函数中的new表达式。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 除了定义拷贝控制成员,管理资源的类通常还定义一个名为 swap 的函数。对于那些与重排元素顺序的算法一起使用的类,...
    赵者也阅读 276评论 0 0
  • 标准库中swap的缺点 如果一个类定义了自己的swap,那么算法将使用类自定义版本,否则算法将使用标准库定义的sw...
    土豆吞噬者阅读 545评论 0 0
  • 在C++中,一个资源管理类(例如含有指向堆内存的指针)中需要重新定义拷贝构造函数、赋值运算符以及析构函数(Big ...
    leon4ever阅读 570评论 0 0
  • 1. 类的默认成员函数 包括6个:构造函数、析构函数、拷贝构造函数、赋值运算符函数、取址运算符函数、const取址...
    zillo阅读 728评论 0 0
  • swap函数几乎是所有初学者都写过的一个最基本的函数之一,通常是用它来了解函数概念、形参与实参、引用和指针。然而,...
    ThdLee阅读 6,040评论 1 2

友情链接更多精彩内容