zoukankan      html  css  js  c++  java
  • 【C++ Primer 第13章】3. 交换操作

    交换操作

     1 class HasPtr {
     2     friend void swap(HasPtr &rhs, HasPtr &yhs);
     3     //其他成员定义
     4 };
     5 
     6 void swap(HasPtr &rhs, HasPtr &yhs)
     7 {
     8     using std::swap;
     9     swap(rhs.ps, yhs.ps); //交换指针,而不是string 
    10     swap(rhs.i, yhs.i);   //交换int成员
    11 }

    在赋值运算符中使用swap

    1 // 注意rhs是按值传递的。意味着HasPtr的拷贝构造函数
    2 // 将右侧运算对象中的string拷贝到rhs
    3 HasPtr& HasPtr::operator=(HasPtr rhs)
    4 {
    5     swap(*this, rhs);
    6     return *this;
    7 }

    13.3节练习

    • 13.30

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 
     5 class HasPtr {
     6     friend void swap(HasPtr &rhs, HasPtr &yhs);
     7 public:
     8     HasPtr(const string &s = string()): ps(new string(s)), i(0) {}
     9     HasPtr(const HasPtr &rhs): ps(new string(*rhs.ps)), i(rhs.i) {}
    10     ~HasPtr();
    11 
    12     HasPtr& operator=(const HasPtr &rhs);
    13     HasPtr& operator=(const string &rhs);
    14     string& operator*();
    15 private:
    16     string * ps;
    17     int i;
    18 };
    19 
    20 HasPtr::~HasPtr()
    21 {
    22     delete ps;
    23 }
    24 
    25 HasPtr& HasPtr::operator=(const HasPtr &rhs)
    26 {
    27     auto newp = new string(*rhs.ps);
    28     delete ps;
    29     ps = newp;
    30     i = rhs.i;
    31     return *this;
    32 }
    33 
    34 HasPtr& HasPtr::operator=(const string &rhs)
    35 {
    36     *ps = rhs;
    37     return *this;
    38 }
    39 
    40 string& HasPtr::operator*()
    41 {
    42     return *ps;
    43 }
    44 
    45 void swap(HasPtr &rhs, HasPtr &yhs)
    46 {
    47     cout << "交换" << *rhs.ps << "" << *yhs.ps << endl;
    48     using std::swap;
    49     swap(rhs.ps, yhs.ps);
    50     swap(rhs.i, yhs.i);
    51 }
    52 
    53 int main()
    54 {
    55     HasPtr h("hi, mom!");
    56     HasPtr h2 = h;
    57     HasPtr h3 = h;
    58     h2 = "hi, dad!";
    59     h3 = "hi, friend";
    60     cout << "h2: " << *h2 << endl;
    61     cout << "h3: " << *h3 << endl;
    62     swap(h2, h3);
    63     cout << "h2: " << *h2 << endl;
    64     cout << "h3: " << *h3 << endl;
    65     return 0;
    66 }

    运行结果:

  • 相关阅读:
    android学习---Gallery画廊视图
    王立平--查看SQLite中的数据信息
    java中CyclicBarrier简单入门使用
    [ExtJS5学习笔记]第三十三节 sencha extjs 5 grid表格导出excel
    使用target打开的iframe 获取src的问题
    读《暗时间》的思考
    hdfs
    编译最新的SQLite 3.8.4.3为一个DLL
    使用Highcharts生成折线图_at last
    CentOS7 安装EFK(elasticsearch、fluent、kibana)进行Docker下日志搜集
  • 原文地址:https://www.cnblogs.com/sunbines/p/9006494.html
Copyright © 2011-2022 走看看