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 }
  • 相关阅读:
    你可能不知道的 transition 技巧与细节
    CSS奇思妙想 -- 使用 CSS 创造艺术
    生僻标签 fieldset 与 legend 的妙用
    CSS 奇思妙想边框动画
    (转)linux命令-- pstack命令(跟踪进程栈)
    (转)PostgreSQL 数据库错误代码解释
    postgresql灾备切换
    (转)postgresql配置参数和概念解释
    (转)PostgreSQL跨库操作Oracle利器-Oracle_fdw
    (转)PG运维常用知识点小结
  • 原文地址:https://www.cnblogs.com/sunbines/p/9004545.html
Copyright © 2011-2022 走看看