第二章 构造函数语意学 编译器何时合成拷贝构造函数?

2023-11-06

首先要清楚位拷贝(浅拷贝)和值拷贝(深拷贝)的区别(参考http://blog.sina.com.cn/s/blog_a2aa00d70101gpvj.html)。位拷贝,及"bitwise copy"是指将一个对象的内存映像按位原封不动的复制给另一个对象,单纯地逐个bit拷贝;所谓值拷贝就是指,将原对象的值复制一份给新对象。在用"bitwise assignment"时会直接将对象的内存映像复制给另一个对象,这样两个对象会指向同一个内存区域,当一个对象被释放后,另一个对象的指针会成为空指针。

一般情况下,一个良好的编译器可以为大部分的class object产生bitwise copies,但是当不必要进行“bitwise copies”时,编译器会产生默认构造函数和拷贝构造函数,以下四种情况就是不需要“bitwise copies”(与前小节的情况一致,只是将默认构造函数替换成拷贝构造函数):

1)如果一个类没有拷贝构造函数,但是含有一个类类型的成员变量,该类型含有拷贝构造函数,此时编译器会为该类合成一个拷贝构造函数;

2)如果一个类没有拷贝构造函数,但是该类继承自含有拷贝构造函数的基类,此时编译器会为该类合成一个拷贝构造函数;

3)如果一个类没有拷贝构造函数,但是该类声明或继承了虚函数,此时编译器会为该类合成一个拷贝构造函数;

4)如果一个类没有拷贝构造函数,但是该类含有虚基类,此时编译器会为该类合成一个拷贝构造函数;

第三种情况正好解释了第一章“关于对象”的第二个问题,由于此时不在符合“bitwise copies”的语义环境,所以编译器会生成拷贝构造函数,在该函数中使虚函数指针仍指向该类的虚函数表地址,如(参考):

会自动给A类生成一个拷贝构造函数,函数中重新设置A类对象的vptr,大致如下:

A::A(const A& a)

{

    this->vptr=A类的虚函数表地址;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二章 构造函数语意学 编译器何时合成拷贝构造函数? 的相关文章

随机推荐

  • Spark相关问题

    Spark相关问题 Hadoop FileFormat接口问题 Hadoop FileOutputFormat在写入数据的时候先写到临时目录 最后写入最终目录 临时目录到最终目录的过程中需要做文件树合并 合并过程中有大量Rename操作 F
  • Hash函数

    概述 Hash函数 散列函数 是一种将任意长度的数据映射到有限长度的域上 通俗来讲 就是将一串任意长度的数据进行打乱混合 转换为一段固定长度的数据输出 这段数据便成为输入数据的一个 指纹 特征 Hash函数的首要目标是保证数据的完整性 而不
  • css连续的纯数字或字母强制换行

    white space normal word break break all
  • 一些网站1

    N1BOOK平台 Nu1L Team Nu1L Team 0004 Median of Two Sorted Arrays LeetCode Cookbook 题库 力扣 LeetCode 全球极客挚爱的技术成长平台
  • 解决shell断开后java进程被结束

    偶尔会碰到用SecureCRT在shell启动java进程并后台运行 命令最后加 的时候 因为断电死机等原因断开shell 然后进程被结束了 运维大佬也说用他们的工具启动进程后一断开连接进程就结束了 后来查到是因为shell在断开的时候会向
  • 漫谈数据挖掘从入门到进阶

    做数据挖掘也有些年头了 写这篇文一方面是写篇文 给有个朋友作为数据挖掘方面的参考 另一方面也是有抛砖引玉之意 希望能够和一些大牛交流 相互促进 让大家见笑了 入门 数据挖掘入门的书籍 中文的大体有这些 Jiawei Han的 数据挖掘概念与
  • Day_1 Part_4 Structures of R

    1 Vector Matrix Array 1 1 What are they Collection of observations Vector 1 dimensional Matrix 2 dimensional Array 3 dim
  • 常见web漏洞及防范(转)

    单个漏洞 需要进行排查与整改 借着别人的智慧 做一个简单的收集 最好能够将常见漏洞 不限于web类的 进行一个统一的整理 这是今年的任务 进行漏洞的工具的收集 为未来的工作做好基础 一 SQL注入漏洞 SQL注入攻击 SQL Injecti
  • MMDetection 3.x中的PackDetInputs

    MMDetection 3 X 里面对pipeline有一个重点修改是新增了 PackDetInputs 有利于统一 进行检测 语义分割 全景分割任务 从配置文件中我们可以看出包含LoadImageFromFile LoadAnnotati
  • electron在BrowserWindow中禁止右键菜单

    最近使用 electron vite solid js 做一个网络流量实时监控的小工具 其中需要禁止用户在获取 BrowserWindow 焦点后弹出默认右键菜单 解决方案 在 new BrowserWindow 后中添加以下代码 禁止右键
  • 静默执行bat文件

    让bat隐藏运行需要用vbs文件才能实现 方式一 使用vbs文件 新建一个 文本文档后缀改为 vbs 可以这样写 set ws WScript CreateObject WScript Shell ws Run d yy bat 0 其中d
  • 《区块链技术与应用》学习笔记2——BTC数据结构

    Hash pointer 哈希指针 指针 在程序运行过程中 需要用到数据 最简单的是直接获取数据 但当数据本身较大 需要占用较大空间时 明显会造成一定麻烦 因此可以引用指针 每次获取相应的数据即可 实际使用中 指针实际上存储的是逻辑地址更多
  • C语言用scanf来判断键盘输入数据类型

    2 可以用来判断是否和定义的类型一致 如 int n if scanf d n 1 else 可以用来判断键盘输入的数据是否是整数
  • 打不开微软自带的软件,或者初次安装sql server 提示下载不了,版本不支持的,一定检查一下这里

    检查这里 这里一定要把代理模式关掉 血的教训啊
  • 吉首大学_编译原理实验题_基于预测方法的语法分析程序的设计【通过代码】

    一 实验要求 实验二 基于预测方法的语法分析程序的设计 一 实验目的 了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法 掌握预测语法分析程序的手工构造方法 二 实验内容 1 了解编译程序的基于预测方法的语法分析过程 2
  • GFS论文解读

    文章目录 1 设计概述 1 1 假设 1 2 GFS架构 1 3 读取流程 1 4 元数据 1 5 操作日志 1 6 一致性模型 2 系统交互 2 1 契约机制 2 2 数据写入过程 2 3 数据流 2 4 原子的记录追加 1 设计概述 1
  • Leetcode[链表] 反转链表 -- 双指针法

    0 题目描述 leetcode原题链接 反转链表 1 双指针法 定义两个指针 pre 和 cur pre 在前 cur 在后 每次让 pre 的 next 指向 cur 实现一次局部反转 局部反转完成之后 pre 和 cur 同时往前移动一
  • Kotlin 31. Kotlin 如何删除文件或文件夹

    Kotlin 如何删除文件或文件夹 比如 我们想要删除 Documents 年月日 文件夹下面的所有文件 包括这个文件夹 我们首先需要获得 Documents 的路径 val extDir File Environment getExter
  • ESP32——WIFI

    WiFi Wi Fi 库支持配置及监控 ESP32 Wi Fi 连网功能 WiFi工作模式 基站模式 即 STA 模式或 Wi Fi 客户端模式 此时 ESP32 连接到接入点 AP AP 模式 即 Soft AP 模式或接入点模式 此时基
  • 第二章 构造函数语意学 编译器何时合成拷贝构造函数?

    首先要清楚位拷贝 浅拷贝 和值拷贝 深拷贝 的区别 参考http blog sina com cn s blog a2aa00d70101gpvj html 位拷贝 及 bitwise copy 是指将一个对象的内存映像按位原封不动的复制给