C++primer学习:拷贝控制(4)
来源:互联网 发布:微信图文编辑软件 编辑:程序博客网 时间:2024/06/05 06:01
交换操作:管理资源的类通常定义一个名为swap的函数.对于哪些与重排元素顺序的算法一起使用的类,定义swap是非常重要的.这类算法会在需要交换两个元素的时候调用swap.
如果一个类定义了自己的swap,那么算法将使用自己的自定义版本.很多时候我们不希望分配内存,而是希望交换指针.
[练习]为类值版本的Hasptr编写swap函数,并测试它.
class Hasptr{ friend void swap(Hasptr &, Hasptr&);public: Hasptr(const string & s = string()) :ps(new string(s)),i(0) {}//在拷贝构造函数中定义成员 Hasptr(const Hasptr & h) : ps(new string(*h.ps)), i(h.i){} //拷贝构造函数 ~Hasptr(){ delete ps; }//析构函数 Hasptr & operator= (const Hasptr &); //拷贝赋值运算符号private: string *ps; int i;};Hasptr & Hasptr:: operator= (const Hasptr &h) //拷贝赋值运算符号{ auto temp = new string(*h.ps); delete ps; ps = temp; i = h.i; return *this;} void swap(Hasptr &lh, Hasptr&rh)//定义了自己的交换{ using std:: swap; cout << "swap (lh,rh)\n"; swap(lh.ps, rh.ps); swap(lh.i, rh.i);}
=====================================================================================================
[练习]为Hasptr类定义一个<运算符,并对一个Hasptr类调用sort,观察什么时候调研swap。
class Hasptr{ friend void swap(Hasptr &, Hasptr&); friend bool operator<(const Hasptr &lh, const Hasptr &rh);public: Hasptr(const string & s = string()) :ps(new string(s)),i(0) {}//在拷贝构造函数中定义三个成员,并且初始化引用计数为1 Hasptr(const Hasptr & h) : ps(new string(*h.ps)), i(h.i){} //拷贝构造函数 ~Hasptr(){ delete ps; }//析构函数 Hasptr & operator= (Hasptr); //拷贝赋值运算符号private: string *ps; int i;};Hasptr & Hasptr:: operator= (Hasptr h) //拷贝赋值运算符号{ swap(*this, h);//只有使用swap定义赋值运算,sort才会调用swap return *this;}bool operator<(const Hasptr &lh, const Hasptr &rh){ return *lh.ps < *rh.ps;} void swap(Hasptr &lh, Hasptr&rh)//定义了自己的交换{ cout << "swap (lh,rh)\n"; swap(lh.ps, rh.ps); swap(lh.i, rh.i);}int main(){ vector<Hasptr> x; x.push_back(Hasptr("cccccc")); x.push_back(Hasptr("bbbb")); x.push_back(Hasptr("aaaaaa")); sort(x.begin(), x.end()); return 0;}
结论:只有用交换操作定义=时才会调用swap.其他的重载是不会让sort调用swap的.
0 0
- C++primer学习:拷贝控制(4)
- C++primer学习:拷贝控制(1)
- C++primer学习:拷贝控制(2)
- C++primer学习:拷贝控制(3)
- C++primer学习:拷贝控制(5)
- C++primer学习笔记----拷贝控制
- c++primer要点-拷贝控制
- C++primer学习:拷贝控制(7):对象移动
- C++primer学习:面象对象程序设计(4):继承类中的作用域和拷贝控制
- 【足迹C++primer】45、拷贝控制示例
- C++primer阅读笔记----------拷贝控制
- 《C++primer(第五版)》学习之路-第十三章:拷贝控制
- C++primer学习:拷贝控制(5):动态内存管理类_编写自己的vector
- C++primer学习:拷贝控制(6):编写简化的string类
- 【足迹C++primer】43、拷贝控制和资源管理
- C++primer第五版笔记-第十三章拷贝控制
- c++primer——拷贝控制和运算符重载
- 《C++Primer》读书笔记——第13章 拷贝控制
- 从头学Qt Quick(2)-- QML语法从一个简单的例子说起
- SpringMVC+uploadify文件上传
- 程序员既要写好代码,又要写好文档
- 黑马程序员--Java学习日记之集合(collection类和map类代码)
- SyBaseのPowerBuilder12.5.1 打开dw时退出 解决方法
- C++primer学习:拷贝控制(4)
- Java基本编程11-冒泡排序
- hadoop-源码原理剖析--------(一)手把手教你如何进行hadoop开发的环境搭建,拒绝深坑!~
- UI23_多线程
- nginx与tomcat集群
- 分治-二叉树重建
- hive sql详细学习
- torch学习(五) simply application
- java中的匿名内部类总结