C++primer学习:拷贝控制(3)
来源:互联网 发布:php for循环乘法口诀表 编辑:程序博客网 时间:2024/09/21 11:18
定义行为象值的类,对于这种定义的类,每一个对象都应该有一份自己的拷贝.它们的改变不会影响原对象.
[练习]:希望StrBlob的行为像一个值,定义相应的拷贝控制成员.
StrBlob(const StrBlob & rhs)//拷贝初始化 { data = make_shared<vector<string>>( vector<string>(*rhs.data)); } StrBlob& operator= (const StrBlob& rhs) { data = make_shared<vector<string>>(vector<string>(*rhs.data)); return *this; }
定义对象行为像指针.我们需要拷贝指针成员本身而不是所指的对象.而最好的办法就是使用shared_ptr来管理资源.这在前面的StrBlob类中就已经体现了.但是如果我们想直接管理资源,使用引用计数是一个有效的办法.我们设计自己的引用计数,而不使用智能指针.
基本方式如下:除了初始化对象外,每个构造函数(除了拷贝构造函数)要创建一个引用计数.,并初始化为1.
拷贝构造函数将计数递增.
析构函数递减计数,如果计数是0则释放资源.
拷贝赋值运算符递增右侧对象,递减左侧对象.如果计数是0则释放资源.
计数器必须用动态内存保存,这样才能够共享数据.
[练习]定义一个使用引用计数的Hasptr类
class Hasptr{public: Hasptr(const string & s = string()) :ps(new string(s)),i(0),use(new size_t(1)) {}//在拷贝构造函数中定义三个成员,并且初始化引用计数为1 Hasptr(const Hasptr & h) : ps(h.ps), i(h.i), use(h.use){ ++*use; } //拷贝构造函数 ~Hasptr();//析构函数 Hasptr & operator= (const Hasptr &); //拷贝赋值运算符号private: string *ps; size_t *use;//zhi int i;};Hasptr::~Hasptr(){ if (--*use == 0)//如果计数为0 { delete use; delete ps; }}Hasptr & Hasptr:: operator= (const Hasptr &h) //拷贝赋值运算符号{ ++*h.use;//递增右对象计数器 if (--*use == 0)//递减左对象计数器 { delete ps; delete use; } ps = h.ps; i = h.i; use = h.use; return *this;}
为一个二叉树定义一个行为像值的类.注意删除时候的顺序.
class TreeNode{public: TreeNode() :left(nullptr), right(nullptr), count(0){} TreeNode(const TreeNode &r) : left(new TreeNode(*r.left)), right(new TreeNode(*r.right)), value(r.value) , count(r.count){} TreeNode& operator= (const TreeNode & r) { auto temp_left = (new TreeNode(*r.left)); auto temp_right = (new TreeNode(*r.right)); delete left; delete right; left = temp_left; right = temp_right; value = r.value; count = r.count; } ~TreeNode(){ delete left; delete right; }private: string value; int count; TreeNode *left; TreeNode *right;};
0 0
- C++primer学习:拷贝控制(3)
- C++primer学习:拷贝控制(1)
- C++primer学习:拷贝控制(2)
- C++primer学习:拷贝控制(4)
- C++primer学习:拷贝控制(5)
- C++primer学习笔记----拷贝控制
- c++primer要点-拷贝控制
- C++primer学习:拷贝控制(7):对象移动
- 【足迹C++primer】45、拷贝控制示例
- C++primer阅读笔记----------拷贝控制
- 《C++primer(第五版)》学习之路-第十三章:拷贝控制
- C++primer学习:拷贝控制(5):动态内存管理类_编写自己的vector
- C++primer学习:拷贝控制(6):编写简化的string类
- C++primer学习:面象对象程序设计(4):继承类中的作用域和拷贝控制
- 【足迹C++primer】43、拷贝控制和资源管理
- C++primer第五版笔记-第十三章拷贝控制
- c++primer——拷贝控制和运算符重载
- 《C++Primer》读书笔记——第13章 拷贝控制
- C#文件写入
- 冒泡排序
- 全局变量、局部变量、静态局部变量及静态全局变量的区别
- [Leetcode] [Database] Duplicate Emails解题思路
- java集合map的遍历
- C++primer学习:拷贝控制(3)
- VS编译时出现error C4996 解决方法
- encodeURI为什么要用两次
- NSZone
- Menu
- 减少java垃圾回收的开销方法
- NSDateComponents Class Reference
- nyoj 2 括号配对(一)
- React-Native进行时(四)--ListView navigator.push