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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 父母50了要离婚怎么办 父母吵架了我该怎么办 父母看孩子总是吵架怎么办 20岁父母离婚我怎么办 碰到没素质的人怎么办 父母抛弃了我该怎么办 父母说家里没钱困难怎么办 遇到素质低的老婆怎么办 孩子考试心里素质差怎么办 5岁儿童脾气不好怎么办 有一个素质差的父母怎么办 孩子对什么都无所谓怎么办 孩子在学习上无所谓怎么办 孩子对学习无所谓的态度怎么办 孩子不上进什么都无所谓怎么办 倔强的学生不理老师怎么办 一岁宝宝特别犟怎么办 孩子遇到问题喜欢发脾气怎么办 企业培养新人跑了怎么办 二年级学生读不懂题目怎么办 6岁宝宝有鼻炎怎么办 外地儿童怎么办北京医保卡 江苏联宝投资的钱怎么办 银行叫开了证券怎么办 中班心理健康我不开心了怎么办 大学生心理健康课总是抢不到怎么办 孩子成绩提不上去怎么办 孩子数学不开窍怎么办 二年级 初中孩子语文不开窍怎么办 分到的班级都是差生怎么办 初三了英语差怎么办呀 初三了英语差的很怎么办 五年级英语太差怎么办 听课效率没有自学效率高怎么办 小学生不好好写作业怎么办 带的家教成绩没有提高怎么办 学生出国学校成绩证明怎么办 学生成绩考差了班主任怎么办 高一的学生成绩跟不上怎么办 综合素质评价手册丢了怎么办 小学综合素质评价手册丢了怎么办