C++之拷贝控制 (Copy Control)
只有2种成员
值成员;
指针成员; 依实现可分为raw pointer / shared_ptr;

现在,仅考虑第③种:资源对象共享 角度来考虑拷贝控制
类的两种语义:值语义、似指针

编译器提供的default版本的copy constructor/ copy assignment的语义:
0. 默认构造:对每个成员进行默认:① 内置类型、指针类型 若未指定初始值则其值未定义。 ② T类类型成员采用T类型的默认构造。
1. 拷贝构造: 对rhs的每个成员进行拷贝。(指针成员只拷贝指针值,不进行其指向的资源对象的拷贝)
2. 拷贝赋值:修改左侧instance的各成员值为右侧对象的对应成员值,即:对lhs的每个成员进行 lhs.member = rhs.member 赋值。
实现自带的 引用计数器
实现机制:
指向同一资源对象instance的多个shared_ptr 联系着同一个 “该资源对象instance的引用计数器”instance
【1个引用计数器实例,针对的肯定是 1个资源instance】
当shared_ptr创建时,引用计数1;拷贝时+1;销毁时-1、并检查:若引用计数变为0,进行资源的释放。
自行实现:
类HasPtr通过 *_p 持有一个string对象资源。
(若该string对象资源 为多个HasPtr的instance-s所共享,则HasPtr的这多个instance-s间共同维护一个的“该string instance的引用计数器”)
shared_ptr<Resource> = {
Resource* pt;
int* referCount;
}

4种可能的 拷贝构造/拷贝赋值/析构 方案
若对某个成员是“值副本持有”:( {T* _pt; T instance} 视作一体 )
copy constructor:拷贝该部分成员资源
T: t (rhs.t); // 默认行为
*pt: pt = new T(*rhs.t);
shared_ptr: sp = make_shared<T>(*rhs.sp);
copy = :拷贝该部分成员资源;释放原资源
T: t = rhs.t; // 默认行为
*pt: T* newpt = new T(*rhs.t); delete pt; pt = newpt; // 可优化吧(指针值相等则不拷贝)
shared_ptr: sp = make_shared<T>(*rhs.sp); // sp.reset(new T(*rhs.sp));也行吧?
move constructor:接管临时对象的instance资源
T: t( move(rhs.t))
*pt: pt = rhs.pt; rhs.pt = nullptr;
shared_ptr: sp(rhs.sp) // 默认行为
move = : 接管临时对象的资源
T: t = move(rhs.t); // 匹配T instance的move assignment
*pt: delete pt; pt = rhs.pt; rhs.pt = nullptr;
shared_ptr: sp = rhs.sp; // 默认行为
析构:
T: // 默认即可
*pt: delete pt;
shared_ptr: // 默认即可
=====================================================================
若对某个成员属于“作为引用者之一”:(成员不可能是 T t; 形式)
copy constructor:指针绑上
*pt: pt( rhs.pt); // 默认
shared_ptr: sp( rhs.sp); // 默认
copy = : 指针绑上
*pt: pt = rhs.pt; // 默认
shared_ptr: sp = rhs.sp; // 默认
move constructor:
*pt: pt (rhs.pt); //默认
shared_ptr: sp (rhs.sp) // 默认
move = :
*pt: pt = rhs.pt; // 默认
shared_ptr: sp = rhs.sp; // 默认
析构:
*pt: //默认即可。析构函数中不能写定delete pt; 需要在最后一个对象使用结束后 显式释放
shared_ptr: // 默认
C++之拷贝控制 (Copy Control)的更多相关文章
- C/C++:copy control (拷贝控制)
前言:当定义一个类的时候,我们显示或者隐式地指定在此类型的对象拷贝,移动,赋值,销毁时做些什么,一个类通过定义五种特殊的成员函数来控制这些操作,包括拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值 ...
- [c++] Copy Control
C++ allows the programmer to define how objects are to be copied, moved, assigned and destroyed. Tog ...
- C++的那些事:类的拷贝控制
1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象 ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数 在我们没 ...
- c/c++ 拷贝控制 构造函数的问题
拷贝控制 构造函数的问题 问题1:下面①处的代码注释掉后,就编译不过,为什么??? 问题2:但是把②处的也注释掉后,编译就过了,为什么??? 编译错误: 001.cpp: In copy constr ...
- c/c++ 拷贝控制 右值与const引用
拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...
- 【C++ Primer | 15】构造函数与拷贝控制
合成拷贝控制与继承 #include <iostream> using namespace std; class Base { public: Base() { cout << ...
- 零拷贝-zero copy
Efficient data transfer through zero copy Zero Copy I: User-Mode Perspective 0. 前言 在阅读RocketMQ的官方文档时 ...
- C/C++基础----拷贝控制
拷贝控制操作,有5个特殊成员函数copy ctor,copy =opt,move ctor,move =opt,dtor 有哪些地方会用到 拷贝初始化 除了=定义变量时 参数传递和函数返回时 花括号列 ...
随机推荐
- php策略模式(strategy pattern)
... <?php /* The strategy pattern defines a family of algorithms, each of which is encapsulated a ...
- 让Discuz! X3.2 SEO标题里的“-”支持空格
打开Discuz!根目录下source\class\helper\helper_seo.php文件找到如下代码: public static function strreplace_strip_spl ...
- Hibernate框架学习3
一对多|多对一 一对多 多对一 级联操作 结论: 简化操作.一定要用,save-update,不建议使用delete. 关系维护 在保存时.两方都会维护外键关系.关系维护两次,冗余了. 多余的维护关系 ...
- LeetCode 348. Design Tic-Tac-Toe
原题链接在这里:https://leetcode.com/problems/design-tic-tac-toe/ 题目: Design a Tic-tac-toe game that is play ...
- Java实现递归阶乘
public class Factorial{ public static void main(String[] args){ for (int i = -5; i <= 5; i++) { S ...
- C# Cef winform 脚本的执行 踩过的坑
先从后端代码 如何执行js 代码谈起; 一个简单的需求: 在winform上点击一个按钮,实现登录信息的填入 流程: 就是让C#去运行一段脚本,. 运行的方式有两种, 异步与同步, 因为CEF是一帧一 ...
- 【字符串】 manacher算法
Algorithm Task 给定一个字符串,求其最长回文子串 Limitations 要求时空复杂度均为线性且与字符集大小无关. Solution 考虑枚举回文串的对称轴,将其对应的最长回文子串长度 ...
- 第08组 Beta冲刺(5/5)
队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 部署新服务器 展示GitHub当日代码/文档签入记录 接下来的计划 准备 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- Oracle_本地计算机上的OracleOraDb11g_home1TNSListener 服务启动后停止
这个IP地址要写对,写成本机IP4的地址