【C++对象模型】构造函数II

构造函数语意学

》》构造函数语意学I—默认构造函数的构造操作《《
》》构造函数语意学II—拷贝构造函数的构造操作《《
》》构造函数语意学III—程序转化语意学《《

拷贝构造函数的构造操作

有三种情况,会以一个object的内容作为另一个class object的初值。

1.直接拷贝

class X{...};
X x;
X xx = x;

2.函数传参

void foo(X x){}
X xx;
foo(xx);

3.函数返回

X foobar()
{
    X xx;
    ...
    return xx;
}

假设class设计者显式定义了一个拷贝构造函数那么在大部分情况下,上述的拷贝构造函数会被调用。

默认成员初始化

如果class没有提供一个显式拷贝构造函数时,其内部是以所谓的默认成员初始化手法完成的,也就是把每一个内建的或派生的成员数据(例如一个指针或一个数组)的值,从某个对象拷贝一份到另一个对象身上。不过它并不会拷贝其中的成员类对象,而是以递归的方式施行成员初始化。

ARM所说:

默认构造和拷贝构造在必要的时候才由编译器产生出来。

这个句子中的“必要”意指当 class 不展现位逐次拷贝时。一个对象可用两种方式复制得到,一种是被初始化,另一种是被指定。从概念上而言,这两个操作分别是以拷贝构造和拷贝赋值运算符(=)完成的。

位逐次拷贝

C++标准把拷贝构造区分为平凡和非平凡两种。只有非平凡的实例才会被合成于程序之中。决定一个拷贝构造是否为平凡的标准在于class是否展现出所谓的“位逐次拷贝”。

以下情况并不需要合成出一个默认拷贝构造,因为上述声明展现了“位逐次拷贝”

class World{
public:
    World(const char *);
    ~World(){delete [] str;}
private:
    int cnt;
    char *str;
}

这种情况下,编译器必须合成出一个拷贝构造,以便调用String的拷贝构造

class World{
public:
    World(const string&);
    ~World(){delete [] str;}
private:
    int cnt;
    string str; //string含有显式拷贝构造
}

什么时候一个class展现出“位逐次拷贝”呢?有4种情况:

  1. 当class内含一个成员对象而后者的class声明有一个拷贝构造时
  2. 当 class继承自一个基类而后者存在一个拷贝构造时
  3. 当 class声明了一个或多个虚函数时。
  4. 当 class派生自一个继承串链,其中有一个或多个虚基类时。

重新设定 Virtual Table的指针

编译期间的两个程序扩张操作:

  1. 增加一个虚函数表(vtbl),内含每一个有作用的虚函数的地址。
  2. 一个指向虚函数表的指针(vptr),安插在每一个 class object内。

如果编译器对于每一个新产生的class object 的vptr不能成功而正确地设好其初值,将导致可怕的后果。

class Bear : public ZooAnimal{...};
//ZooAnimal内含有虚函数animal(),draw()
//Bear内含有虚函数animal(),draw(),dance()
Bear yogi;
Bear winner = yogi;

yogi会被默认Bear构造初始化。而在构造函数中,yogi的vptr被设定指向Bear class 的 virtual table (靠编译器安插的代码完成)。因此,把 yogi的vptr值拷贝给winnie的vptr是安全的。

在这里插入图片描述

ZooAnimal franny = yogi;//发生切割行为

franny的vptr不可以被设定指向Bearclass的virtual table(但如果yogi的vptr被直接“逐次拷贝”的话,就会导致此结果),否则当上面程序片段中的draw()被调用而franny被传进去时,就会“炸毁”
在这里插入图片描述

让我再以上面这张图来补充说明yogi和franny的关系
也就是说,合成出来的ZooAnimal拷贝构造会显式设定object的vptr指向ZooAnimalclass的virtual table,而不是直接从右手边的class object中将其vptr现值拷贝过来。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansible自动化运维工具及模块

目录 一、Ansible 1.ansible简介 2、ansible的特性 二、ansible的部署 1)管理端安装ansible 2)配置主机清单 3)配置密钥对验证 三、ansible命令块模块 1)command模块 2)shell模块 3)cron模块 4)…

MySQL如何查找删除重复行?

如何查找重复行 第一步是定义什么样的行才是重复行。多数情况下很简单:它们某几列具有相同的值。本例采用这种定义,或许你对“重复”的定义得很复杂,你需要对sql做些修改。本例要用到的数据样本: create table test(id int not …

C字符函数及字符串函数

但行前路&#xff0c;莫问归期 要注意的是&#xff0c;要使用下边所讲的函数要包含头文件<string.h> strlen 求字符串的长度 函数参数&#xff1a;字符串指针 函数功能&#xff1a;传入字符串指针&#xff0c;字符串是以\0为结束标志&#xff0c;返回的类型size_t其实…

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】一、入门知识讲解 &#xff08;C关键字、命名空间、C输入&输出、缺省参数、函数重载&#xff09;-CSDN博客 六 . 引用 &#xff08;1&#xff09;. 引用的概念和特性…

同城跑腿服务预约小程序的作用如何

无论是互联网服务化加快还是前几年疫情冲击&#xff0c;在同城生活服务场景中出现了很多商机&#xff0c;如外卖跑腿、校园跑腿、代买代送等&#xff0c;无论公司还是个人都借势不断提升自己品牌的影响力&#xff0c;并且依赖朋友圈不断提升生意营收。 同城跑腿品牌不少&#…

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制&#xff0c;这导致我们在看源码时经常很疑惑&#xff0c;难以理解&#xff0c;而其中包含的编程套路可能是一些成熟的技术&#xff0c;只是我们不熟悉&#xff0c;比如WebRTC中类似于Qt的信号槽机制&#xff0c;线程事件处理, 或者使用系统异…

CS224W5.2——Relational and Iterative Classification

本节中&#xff0c;我们介绍用于节点分类的关系分类器和迭代分类。 从关系分类器开始&#xff0c;我们展示了如何基于邻居的标签迭代更新节点标签的概率。然后讨论迭代分类&#xff0c;通过根据邻居的标签及其特征预测节点标签来改进集体分类。 文章目录 1. 框架2. 关系分类3.…

软件测试之Web自动化测试,Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

JUC下常见类

JUC(java.util.concurrent) 的常见类ReentrantLock原子类线程池信号量SemaphoreCountDownLatch JUC(java.util.concurrent) 的常见类 ReentrantLock ReentrantLock可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全。 用法: lock(): 加锁, 如果获…

【开源】基于Vue.js的大学兼职教师管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0…

Arduino、arm、树莓派、单片机四者有什么不同

文章目录 ArduinoARM树莓派单片机 初学单片机的同学&#xff0c;可能会对Arduino、ARM、树莓派以及单片机这些概念比较模糊&#xff0c;实际上&#xff0c;这四个是不同的概念和技术。 Arduino Arduino&#xff08;阿尔杜伊诺&#xff09;是一种开源电子原型平台&#xff0c;它…

基于SSM的房屋租售信息管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

人工智能基础_机器学习022_使用正则化_曼哈顿距离_欧氏距离_提高模型鲁棒性_过拟合_欠拟合_正则化提高模型泛化能力---人工智能工作笔记0062

然后我们再来看一下,过拟合和欠拟合,现在,实际上欠拟合,出现的情况已经不多了,欠拟合是 在训练集和测试集的准确率不高,学习不到位的情况. 然后现在一般碰到的是过拟合,可以看到第二个就是,完全就把红点蓝点分开了,这种情况是不好的, 因为分开是对训练数据进行分开的,如果来…

Vatee万腾科技决策力的未来展望:开创数字化创新的新高度

随着科技不断演进&#xff0c;Vatee万腾的科技决策力在数字化创新领域展现出了强大的潜力和前瞻性。 Vatee万腾的科技决策力被视为数字化创新的引擎&#xff0c;为未来创新注入了新的动力。通过深刻的市场洞察和科学决策&#xff0c;Vatee万腾致力于推动数字化创新走向新的高度…

mycat2 读写分离

mycat2 读写分离 mycat2 读写分离1.创建两个主从复制的数据库2.mycat2 读写分离3.mycat2读写分离测试 mycat2 读写分离 1.创建两个主从复制的数据库 参考&#xff1a;mysql主从复制 2.mycat2 读写分离 连接到mycat数据库 1.在mycat中创建数据库mydb1 CREATE DATABASE mydb…

linux发展史(必看系列)

Linux介绍&#xff1a; Linux&#xff0c;Linux Is Not UniX 的首字母缩写。是一款开源的&#xff0c;能自由传播的类Unix的操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到…

iOS 17.2更新:15Pro支持拍摄空间视频!

苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右&#xff0c;内部版本号为&#xff08;21C5040g&#xff09;&#…

山西电力市场日前价格预测【2023-11-12】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-12&#xff09;山西电力市场全天平均日前电价为224.59元/MWh。其中&#xff0c;最高日前电价为434.30元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体

参考链接&#xff1a;https://web.qianguyihao.com/02-CSS%E5%9F%BA%E7%A1%80/12-CSS3%E5%B1%9E%E6%80%A7%E8%AF%A6%E8%A7%A3%EF%BC%9A%E5%8A%A8%E7%94%BB%E8%AF%A6%E8%A7%A3.html#_3%E3%80%81%E6%97%8B%E8%BD%AC%EF%BC%9Arotate 过渡 transition的中文含义是过渡。过渡是CSS…

【Linux网络】系统调优之聚合链路bonding,可以实现高可用和负载均衡

一、什么是多网卡绑定 二、聚合链路的工作模式 三、实操创建bonding设备&#xff08;mode1&#xff09; 1、实验 2、配置文件解读 3、查看bonding状态,验证bonding的高可用效果 三、nmcli实现bonding 一、什么是多网卡绑定 将多块网卡绑定同一IP地址对外提供服务&#xf…