深度搜索C++对象模型 - 复制构造函数

SCAU软件开发基础C++复习 C++语言程序设计(第4版) 文章目录C++语言程序设计(第4版)第一章 绪论1.1 面向对象的基本概念1.1.1 对象1.1.2 类(数据类型)1.1.3 封装1.1.4 继承1.1.5 多态性第二章 C++简单程序设计2.1 C++的特点2.2 基本数据类型2.3 变量的存储类型2.4 运算方式和表达式2.4.1 算数运算式与算数表达式2.4.2 赋值运算符与赋值表达式2.4.3 逗号运算和逗号表达式2.4.4 逻辑运算与逻辑表达式2.4.5 条件运算符与条件表达式2.4.6 sizeof运算符2.4. 阅读详情


深度搜索C++对象模型: 复制构造函数

由构造函数篇可以猜到, 复制构造函数其实也"不一定"会被编译器产生..

提到复制,自然是类成员之间的复制, 有三种情况 会把一个 class object 的内容作为另一个 class object 的初值:
--> 对一个 class object 做显示的初始化操作:
class A { };
A a;
A b = a;

--> 对一个 class object 做传值调用:
void Func( A a );
A a;
void Func( a );

--> 当函数传递回一个 class object :
A Func()
{
 A a;
 return a;
}

//*********************************************************************************************//

当一个 class object "不展现" Bitwise Copy Semantics ( 位逐次拷贝 ) 时, 编译器才会为 class 合成一个复制构造函数;
对于一个普通的类来说 他本身是"展现位逐次拷贝" 的,但是在以下几种情况 他会"失去位逐次拷贝",此时编译器会为他合成复制构造函数

//-----------------------------------------------------------------------------------------------------------------------//

---> 当 class 内含一个 class member object, 而且这个 class member object 有一个 复制构造函数,
( "重申": 存在一个复制构造函数, 不管这个复制构造函数是被显示了声明了,还是因为某种原因被编译器合成了 )

//-----------------------------------------------------------------------------------------------------------------------//

---> 当 class 继承自一个 base class, 而且这个 base class 存在一个 复制构造函数,
( "重申": 存在一个复制构造函数, 不管这个复制构造函数是被显示了声明了,还是因为某种原因被编译器合成了 )

//-----------------------------------------------------------------------------------------------------------------------//

---> 当 class 内使用了 virtual Function 机制: ( 主要是 vptr )
class ZooAnimal { public: virtual ZooAnimal(); };
class Bear : public ZooAnimal { };

Bear yogi;
Bear wninie = yogi;
此时 yogi 会被 默认构造函数初始化, 然后 yogi 的 vptr 被设定为指向了 Bear class virtual table,
因此 把 yogi 的 vptr 通过 "位逐次拷贝" 复制给 wninie 是安全的;

ZooAnimal franny = yogi;
此时 发生了一次"切割", 但是我们通过 "位逐次拷贝" 分析,则会发现 franny 的 vptr 被设置为了 yogi 的 vptr ( 其实是 Bear class virtual table )
这不符合实际情况, 所以编译器要合成一个默认复制构造函数, 来显示的把 franny 的 vptr 设置为指向 ZooAnimal class virtual table;

//-----------------------------------------------------------------------------------------------------------------------//

---> 当 class 派生自一个继承串链, 其中有 virtual base class
class A { };
class B : virtual public A { };

//-----------------------------------------------------------------------------------------------------------------------//

总结: 以上4种情况, "编译器必须为未声明复制构造函数的类合成一个默认复制构造函数",

至于"不属于以上4种情况的而且又没有声明复制构造函数", "没有复制构造函数会被合成出来";

什么时候我们需要一个 复制构造函数?
答案: 不一定
一般来说 我们没有任何理由提供给程序一个复制构造函数,因为编译器已经为我们做了最合理的事情
但是 当我们预见到我们的程序需要进行" 传值复制一个 member object " 的时候 那么提供一个复制构造函数是合情合理的

//*********************************************************************************************//

C++智能物流调度系统:从单元测试到性能优化的全链路工程实践 在软件工程领域,性能优化与系统稳定性是衡量工业级软件成熟度的关键指标。其核心原理在于通过系统性的测试与调优,确保软件在高并发、高负载场景下仍能保持高效、可靠的运行。这对于处理海量实时数据的系统,如智能调度、推荐引擎等,具有极高的技术价值。在实际应用中,开发者常面临内存泄漏、锁竞争、算法效率等挑战。本文以智能物流调度系统为具体场景,深入探讨了如何运用分层测试策略、性能压测工具(如Apache JMeter)、内存分析技术(如tcmalloc/pprof)以及算法优化等手段,系统性地解决这些问题,实现系统从“能 阅读详情

相关推荐

【HarmonyOS 5】鸿蒙APP使用【团结引擎Unity】开发的案例教程

以下是基于团结引擎开发鸿蒙Unity应用的详细案例教程,整合环境配置、工程适配、跨语言通信等核心环节。

2201_75709314的博客 2483

深度探索C++ 对象模型

深度探索C++ 对象模型 第二章 对象 第二章第一节 类对象所占用的空间 成员函数不占用类对象的内存空间一个类对象至少占用1个字节的内存空间成员变量是占用对象的内存空间成员函数 每个类只诞生 一个(跟着类走),而不管你用这个类产生了多少个该类的对象; 第二章第二节 对象结构的发

weixin_42252757的博客 1173

f_fs.c 初始化流程(进行中)

前言 之所以选择f_fs.c作为这系列的开始,因为usb在/driver/usb下面的内容实在太多太多,如果讲各种各样点会太分散了。所以决定切入点以实际使用为主,就是f_fs了,目前我了解这是做bulk裸传输使用的,具体的通信协议自己确定。 初始化部分 开始点从这个路径下说起, /drivers/usb/gadget/function/f_fs.c 然后f_fs.c第一个使用的是include/composite.h中的宏定义function #define DECLARE_USB_FUNCTION(_n

weixin_36406973的博客 1967

C++对象模型详解

C++对象模型详解 原文链接:吴秦大神的C++对象模型。 何为C++对象模型? C++对象模型可以概括为以下2部分: 1、语言中直接支持面向对象程序设计的部分; 2、对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分,如构造函数、析...

dichuangheng8094的博客 605

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3721

无人机WIFI集群组网技术详解及成本分析

无人机WIFI集群组网技术是指利用无人机作为移动平台,通过集成高性能的WIFI模块,实现多架无人机之间以及无人机与地面控制站之间的无线通信组网。在协议层面,无人机WIFI集群组网需要遵循标准的无线通信协议,如IEEE 802.11系列(即WIFI标准),同时可能还需定制或优化路由协议、媒体访问控制(MAC)协议等,以确保高效、可靠的数据传输。数据安全与隐私保护:无人机集群组网中传输的数据可能涉及敏感信息,需采取加密、认证等安全措施,确保数据传输的安全性和用户隐私的保护。根据性能不同,价格差异较大。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1583

深度探索C++对象模型

c++对象模型语言中直接支持面向对象程序设计的部分对于各种支持的底层实现机制说白了是介绍编译器是如何支持、实现C++的面向对象机制的。如,继承、虚函数、指向class members的指针等等,编译器是如何实现的。本书C++语法基于C++95本书出版自2001年,虽然书中用到的标准早已盖棺定论,cfront编译器也早已过时,当时来看一些无法确定的标准、难以实现的技术、功能也早已实现,但是对C++对象模型的某些实现方式依然沿用至今。这本书依然不过时。

surfaceyan的博客 1825

让Qt程序适配高分辨率屏幕,解决软件界面错乱异常

前期使用Qt开发一个登录模块一直使用很好。最近在一台新电脑上使用时发现排版混乱。这个问题很普遍,主要原因是旧软件对高清显示器的适配不当造成的。新电脑使用的是4K屏,win10系统自动进行了175%的缩放。

cihron的博客 1万+

c++_learning-对象模型探索

深入介绍了c++类对象的内存布局,以及虚函数的引入对内存布局分布的影响。c++因虚函数的引入,产生的动态多态的性质分析。函数模板、类模板的分析。

qq_44599368的博客 1627

Oracle EBS R12 AP模块发票导入接口实战:从SQL插入到API调用的完整流程

本文详细解析了Oracle EBS R12 AP模块发票导入接口的完整流程,从SQL插入到API调用的实战技巧。涵盖接口表设计、数据验证、双通道导入机制及错误诊断,特别分享官方文档未提及的高阶优化方案,助力企业实现财务数字化转型。

weixin_33728268的博客 476

《Python星球日记》 第72天:问答系统与信息检索

《Python星球日记》 第72天:问答系统与信息检索,在前面的日子里,我们学习了自然语言处理的基础知识,包括文本预处理、词向量、Transformer架构和各种预训练模型。今天,我们将探索问答系统这一NLP的重要应用,以及如何结合信息检索技术构建智能问答系统。

Code_流苏:在代码中寻诗意,在实践中觅真知 1075

《深度探索C++对象模型》读书笔记

https://www.cnblogs.com/wickedpriest/p/6527181.html https://www.cnblogs.com/wickedpriest/p/6580134.html 前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++、操作系统、计算机网络、算法和数据结构等。C++就先从这本《深度探索C++对象模型》开始。不同于...

$firecat利白的代码足迹$ 919

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

深度搜索C++对象模型 - 构造语义学

 深度搜索C++对象模型:  构造,拷贝,析构语义学 //*********************************************************************************************// ---> "构造函数语义学": class A {     public:     virtual ~A() = 0;     v

github_21089181的专栏 473

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

深度搜索C++对象模型2.2 构造函数语义学-Copy Constructor的构造操作

Shallow Copy = Bitwise Copy,Deep Copy = Memberwise Copy.

春秋战车 1066

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

类的继承(基础实验探究实验报告)(实验一)

图一我也不想啊,只是他真的太像用来写博客的东西了。

lyyg050625csjk的博客 865

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++实现克朗代克纸牌AI求解器:算法、搜索与启发式策略

状态空间搜索是人工智能和算法设计中的核心概念,它通过系统地探索所有可能的配置来寻找问题的最优解或可行解。其基本原理是构建一个状态图,并使用深度优先搜索(DFS)、广度优先搜索(BFS)或启发式搜索等算法进行遍历。这项技术的核心价值在于将复杂的、看似依赖直觉的决策过程(如游戏策略)转化为计算机可执行的确定性问题。在游戏AI、自动化规划和路径寻找等场景中,状态空间搜索是实现智能决策的基石。本文聚焦于将这一通用技术应用于经典单人纸牌游戏——克朗代克耐心纸牌,详细阐述了如何利用C++构建一个高效的AI求解器,其中涉

aoe41606的博客 448

第二周总结:读资料总结

一:作业本怎样做节省时间,来源知乎 错题本怎么做省时间? - 知乎 (zhihu.com) 认真对待试卷,把各科试卷用小夹子整理好 不能在整理错题上浪费太多时间,不能天天整理错题,假装自己很努力 不要整理一些没用的,自己未来从来不会再碰一次的错题。 不要把题目直接抄到错题本上,而是要再做一遍 错题本一定要随时翻阅,要不记了没用 不要用手机记错题,可能记一道题玩一小时 二:Re: 从零开始的程序设计竞赛(五) Re: 从零开始的程序设计竞赛(五) - 知乎 (zhihu.com) 不要天..

qq_64246637的博客 1760

图遍历的应用之寻找欧拉回路

欧拉回路其实就是我们俗称的“一笔画”问题 好,先提出一点问题,欧拉回路是什么? 在回答这个问题前,首先要说的是欧拉路径 如果在一个图中,可以找到一条路径,使得路径对图中的每一条边正好经过一次,则这条路径被称为欧拉路径; 当欧拉路径的起点与终点相同时,又被称为欧拉回路。 判断欧拉回路是否存在 如果有奇数桥的地方不只两个,则欧拉回路不存在 如果均为偶数桥,则任意一点出发均能找到欧拉回路 如果只有两个地方有奇数桥,可以从这二者之一出发,寻找到欧拉回路。 寻找欧拉回路 基本思想:深度遍历 先.

weixin_62112809的博客 970

python编程高手教程_写给编程高手的Python教程(11) 深入类和对象

学习使我快乐鸭子类型和多态当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。例如下面三个类(Cat、Dog、Duck)的定义中都定义了say方法class Cat:def say(self):print("I am a cat!")class Dog:def say(self):print("I am a dog! ")class Duck:def say(se...

weixin_39957312的博客 87

写给编程高手的Python教程(11) 深入类和对象

学习使我快乐 鸭子类型和多态 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 例如下面三个类(Cat、Dog、Duck)的定义中都定义了say方法 class Cat: def say(self): print("I am a cat!") class Dog: def say(self): print("I am a dog! ") class ...

程序员八阿哥 246

深度探索C++对象模型笔记

一、关于对象 C 语言是程序性的,语言本身并没有支持数据和函数之间的关联性 C++ 中可能采取抽象数据类型,或者是多层次的类结构完成 C++ 的封装并没有增加多少成本,每一个成员函数虽然在class中声明,但是却不出现在每个对象中 每一个非内联的成员函数只会诞生一个函数实例 每个内联函数会在其每一个使用者身上产生一个函数实例 C++ 在布局以及存储时间上主要的额外负担是由virtual引起的 虚函数机制用以支持一个有效率的“执行期绑定” 虚基类用来实现“多次出现在继承关系中的基类,有一

hailong66666的博客 970

深度探索C++对象模型-第三章

Data语意学 一 成员变量的绑定 如果在类内部和外部出现了同名成员变量,而类的内部在成员变量声明前有内联成员函数的话,会有以下误解: extern float x; class A{ public: int func(){ return X; } private: int x; }; 这里的x不会出现绑定错误的原因,因为C++内部将内联函数放到整个类的后面进行处理,...

7now_的博客 721

深度探索C++对象模型(笔记)

(4)虚函数 不管几个虚函数,sizeof()都是多了4个字节。 (4.1)类只要有两个虚函数,这个这个类会产生一个只想 虚函数的指针 有两个虚函数,那么这个类就会产生两个指向虚函数的指针。 //类本身 指向虚函数的 指针(一个或者一堆)要有地方存放,存放在一个表格里。 这个表格我们成为虚函数 virtual table vtbl。这个虚函数一般是保存在可执行文件中的,在程序执行的时候载入到内存中...

asladfa的博客 2644

深度搜索C++对象模型 - 构造函数

 深度搜索C++对象模型: 构造函数 Default Constructor 构造函数: C++ARM告诉我们: Default Constructor在需要的时候被编译器产生出来. 关键字: 在需要的时候 --> 被谁需要 需要来干什么? 例子: class Foo {  public:   int m_val;   Foo *next; }; void FooBa

github_21089181的专栏 494

《深度探索c++对象模型》学习笔记

1、c++的布局和存取时间成本?封装并未给c++带来任何的空间或执行期的不良后果,c++在布局和存取时间上的主要额外负担由虚拟化引起。包括: 1)virtual function机制。用以支持一个有效率的“执行期绑定”。 2)virtual base class机制。用以实现“多次出现在继承体系中的base class,有一个的单一而被共享的实例”。2、虚拟继承虚拟继承是多重继承中特有的概念。虚

爱橙子的OK绷的专栏 2559
上一篇: 深度搜索C++对象模型 - 构造函数
下一篇: 深度搜索C++对象模型 - 函数语义学
zhang_yao_wu1993
博客等级 码龄12年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值