控制拷贝和资源管理、类指针例子
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
控制拷贝和资源管理、类指针例子相关推荐
- 拷贝控制——拷贝控制和资源管理,交换操作,对象移动
一.拷贝控制和资源管理 通常,管理类外资源的类必须定义拷贝控制成员,这种类需要通过析构函数来释放对象所分配的资源. 为了定义这些成员,我们首先必须确定此类型对象的拷贝语义.一般来说,有两种选择:可以定 ...
- 【C++】C++类的学习(二)——构造函数、析构函数、拷贝构造函数以及this指针
[fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 1. 前言 在之前的博文< C++类的学习(一)--初识类>中,简单地讲述了类的 ...
- c++类指针赋值表达式必须是可修改的左值_C++进阶教程系列:全面理解C++中的类...
原标题:C++进阶教程系列:全面理解C++中的类 关注Linux公社 最近刷了一些题,也面试了一些公司,把关于C++中关于类的一些概念总结了一下. 在这里也反思一下,面试前信心满满自以为什么都懂,毫无 ...
- 将派生类指针赋值给基类的指针
除了可以将派生类对象赋值给基类对象(对象变量之间的赋值),还可以将派生类指针赋值给基类指针(对象指针之间的赋值).我们先来看一个多继承的例子,继承关系为: #include <iostream& ...
- (学习c++primer5th的重要)c++ primer5th类指针版本hasptr (网上源代码错误) 定义错误
首先回顾点知识点(以下是我自己的想法,如有错误,请在评论区多多指正): 1.如果一个内置指针被别的指针接管资源,那么它必须置于安全析构状态(nullptr或者0都可以) 2.如果一个容器被接管资源,那 ...
- 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...
- [Effective C++ --014]在资源管理类中小心copying行为
第一节 <背景> 条款13中讲到"资源取得的时机便是初始化时机"并由此引出"以对象管理资源"的概念.通常情况下使用std中的auto_ptr(智能指 ...
- 【C++】【读个小故事就弄懂】为什么基类指针可以指向派生类对象,而派生类指针却不可以指向基类对象?(最易懂最有趣最生动的举例)
在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间. 当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素. 于是基类的指针就可 ...
- 3. 类指针与智能指针
3. 类指针与智能指针 本篇主要解答以下问题: 类的对象与类指针的区别 为什么要用智能指针 unique_ptr 和 shared_ptr 3.1 类对象与类指针 实例化一个类的时候,有两种方式,一是 ...
最新文章
- OpenCV 中的 convertTo 函数
- nginx 集群部署_如何备份和还原您的Kubernetes集群资源和持久卷?
- hibernate中的PO持久化对象及PO三种状态
- TensorFlow模型持久化
- TCP 三次握手四次挥手
- 将手机网站做成手机应用的JS框架
- 工作312:uni-弹出框显示数据
- 三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放
- activiti 常见问题总结
- 神奇的 37% 的概率
- linux核心设计ebpf,Linux eBPF介绍
- STM32 高速定时器配置为PWM使用细节
- 如何引导机器?如何面临人机结合?《​人工智能与人类未来》
- 安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换
- Linux版本查看及PS1配置
- 判断某个字符串是否为数字
- Linux账户管理详解
- 2021-01-20
- 解决FTP文件访问需要输入用户名和密码的问题
- 提升客户生命周期价值(CLV)的5大方法