zoukankan      html  css  js  c++  java
  • 【C++ Primer 第13章】2. 拷贝控制和资源管理

    拷贝控制和资源管理

    • 类的行为像一个值。意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响。

    • 行为像指针的类则共享状态。当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据,改变副本也会改变原对象。

    13.2节练习

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

    运行结果:

    行为像值的类

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 
     5 class HasPtr {
     6 public:
     7     HasPtr(const string &s = string()): ps(new string(s)), i(0) {}
     8     HasPtr(const HasPtr &rhs): ps(new string(*rhs.ps)), i(rhs.i) {}
     9 
    10     HasPtr& operator=(const HasPtr &rhs);
    11     ~HasPtr() { delete ps; }
    12 private:
    13     string *ps;
    14     int i;
    15 };
    16 
    17 HasPtr& HasPtr::operator=(const HasPtr &rhs)
    18 {
    19     auto newp = new string(*rhs.ps);
    20     delete ps;
    21     ps = newp;
    22     return *this;
    23 }

    定义行为像指针的类

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 
     5 class HasPtr {
     6 public:
     7     HasPtr(const string &s = string()): ps(new string(s)), i(0), use(new size_t(1)) {}
     8     HasPtr(const HasPtr &rhs): ps(rhs.ps), i(rhs.i), use(rhs.use) { ++*use; }
     9 
    10     HasPtr &operator=(const HasPtr &rhs);
    11     ~HasPtr();
    12 
    13 private:
    14     string * ps;
    15     int i;
    16     size_t *use;  //用来记录有多少个对象共享*ps的成员
    17 };
    18 
    19 HasPtr &HasPtr::operator=(const HasPtr &rhs)
    20 {
    21     ++*rhs.use;
    22     if (--*use == 0)
    23     {
    24         delete ps;
    25         delete use;
    26     }
    27     ps = rhs.ps;
    28     i = rhs.i;
    29     use = rhs.use;
    30     return *this;
    31 }
    32 
    33 HasPtr::~HasPtr()
    34 {
    35     if (--*use == 0)
    36     {
    37         delete ps;
    38         delete use;
    39     }
    40 }
  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/sunbines/p/9004545.html
Copyright © 2011-2022 走看看