13.2控制拷贝和资源管理
1.如果类的每个对象相互独立,不共享除静态成员以外的元素,那么称之为类值的;如果如果类的每个对象不是相互独立,共享了除静态成员以外的元素,那么称之为类指针的。
2.大多数赋值运算符组合了析构函数函数拷贝构造函数的工作,赋值运算符还必须考虑自赋值的正确性。
3.类指针的类最好是用shared_ptr来管理类中的资源,否则需要自行定义一个引用计数,将计数器保存在动态内存中
下面是一个类指针的程序例子:

#include <iostream>
#include <string>using namespace std;class hasptr {friend void swap(hasptr&, hasptr&);
public:hasptr(const string &s = string()) :ps(new string(s)), i(0), use(new size_t(1)) { }hasptr(const hasptr &p) :ps(p.ps), i(p.i), use(p.use) {++*use;}hasptr& operator = (const hasptr&);hasptr& operator = (const string &);string& operator*();~hasptr();private:string *ps;int i;size_t *use;
};hasptr::~hasptr()
{if (--*use == 0)     //每销毁一个对象,就将其use指针指向的内存内容减一{delete ps;delete use;}
}hasptr& hasptr::operator = (const hasptr &rhs)
{++*rhs.use;if (--*use == 0){delete ps;delete use;}ps = rhs.ps;i = rhs.i;use = rhs.use;return *this;
}hasptr& hasptr::operator = (const string & rhs)
{*ps = rhs;return *this;
}string & hasptr::operator *()
{return *ps;
}inline void swap(hasptr& lhs, hasptr& rhs)
{using std::swap;swap(lhs.ps, rhs.ps);swap(lhs.i, rhs.i);
}int main(int argc, char*argv[])
{hasptr h("hi mom");hasptr h2 = h;h = "hi dad";cout << "h: " << *h << endl;cout << "h2: " << *h2 << endl;return 0;
}

  

转载于:https://www.cnblogs.com/hi3254014978/p/9412348.html

控制拷贝和资源管理、类指针例子相关推荐

  1. 拷贝控制——拷贝控制和资源管理,交换操作,对象移动

    一.拷贝控制和资源管理 通常,管理类外资源的类必须定义拷贝控制成员,这种类需要通过析构函数来释放对象所分配的资源. 为了定义这些成员,我们首先必须确定此类型对象的拷贝语义.一般来说,有两种选择:可以定 ...

  2. 【C++】C++类的学习(二)——构造函数、析构函数、拷贝构造函数以及this指针

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 1. 前言 在之前的博文< C++类的学习(一)--初识类>中,简单地讲述了类的 ...

  3. c++类指针赋值表达式必须是可修改的左值_C++进阶教程系列:全面理解C++中的类...

    原标题:C++进阶教程系列:全面理解C++中的类 关注Linux公社 最近刷了一些题,也面试了一些公司,把关于C++中关于类的一些概念总结了一下. 在这里也反思一下,面试前信心满满自以为什么都懂,毫无 ...

  4. 将派生类指针赋值给基类的指针

    除了可以将派生类对象赋值给基类对象(对象变量之间的赋值),还可以将派生类指针赋值给基类指针(对象指针之间的赋值).我们先来看一个多继承的例子,继承关系为: #include <iostream& ...

  5. (学习c++primer5th的重要)c++ primer5th类指针版本hasptr (网上源代码错误) 定义错误

    首先回顾点知识点(以下是我自己的想法,如有错误,请在评论区多多指正): 1.如果一个内置指针被别的指针接管资源,那么它必须置于安全析构状态(nullptr或者0都可以) 2.如果一个容器被接管资源,那 ...

  6. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  7. [Effective C++ --014]在资源管理类中小心copying行为

    第一节 <背景> 条款13中讲到"资源取得的时机便是初始化时机"并由此引出"以对象管理资源"的概念.通常情况下使用std中的auto_ptr(智能指 ...

  8. 【C++】【读个小故事就弄懂】为什么基类指针可以指向派生类对象,而派生类指针却不可以指向基类对象?(最易懂最有趣最生动的举例)

        在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间.     当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素.     于是基类的指针就可 ...

  9. 3. 类指针与智能指针

    3. 类指针与智能指针 本篇主要解答以下问题: 类的对象与类指针的区别 为什么要用智能指针 unique_ptr 和 shared_ptr 3.1 类对象与类指针 实例化一个类的时候,有两种方式,一是 ...

最新文章

  1. OpenCV 中的 convertTo 函数
  2. nginx 集群部署_如何备份和还原您的Kubernetes集群资源和持久卷?
  3. hibernate中的PO持久化对象及PO三种状态
  4. TensorFlow模型持久化
  5. TCP 三次握手四次挥手
  6. 将手机网站做成手机应用的JS框架
  7. 工作312:uni-弹出框显示数据
  8. 三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放
  9. activiti 常见问题总结
  10. 神奇的 37% 的概率
  11. linux核心设计ebpf,Linux eBPF介绍
  12. STM32 高速定时器配置为PWM使用细节
  13. 如何引导机器?如何面临人机结合?《​人工智能与人类未来》
  14. 安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换
  15. Linux版本查看及PS1配置
  16. 判断某个字符串是否为数字
  17. Linux账户管理详解
  18. 2021-01-20
  19. 解决FTP文件访问需要输入用户名和密码的问题
  20. 提升客户生命周期价值(CLV)的5大方法

热门文章

  1. 与技术无关,犯错了,希望大家帮下
  2. Wordpress 自定义文章类型添加 Categoried、Tags
  3. GIT 添加多个git账号
  4. Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明
  5. Git-github 的基本应用
  6. 编程语言和shell编程的基础内容以及grep、egrep命令及相应的正则表达式和用法...
  7. Dapper实用教程
  8. Hessian Spring相关使用的简单例子
  9. 动态添加TemplateField列
  10. Mozilla Firefox 66 将使用更少的内存,提高扩展性能