构造、析构、拷贝(Semantics of Construction,Destruction,and Copy)

1、继承体系下的对象构造

当我定义一个object如下

T object;

如果T有一个默认构造函数,它会被调用。
比较不明显的是构造函数内部有大量的隐藏代码,因为编译器会扩充构造函数,一般而言编译器所做的扩充如下:

  • 记录在成员初始化列表中的数据成员初始化操作会被放到构造函数体中,并以成员的声明顺序为顺序。
  • 如果成员没有在初始化列表中,但是它有一个默认构造函数,那么它的默认构造函数也要被调用
  • 如果有虚函数,须在构造函数里设置虚指针。
  • 如果有基类并且基类有构造函数,基类的构造函数必须被调用,以声明顺序为顺序,和初始列表的顺序无关。
  • 虚基类的构造函数也必须被调用,顺序由左向右
2、虚指针(vptr)初始化

如果在构造函数里调用虚函数,那么调用的将是当前类里的那个函数,不会调用派生类里的虚函数。

原因是:vptr的设置时间点是在 所有基类构造完之后,用户代码之前。

下面是类A、B、C的代码:

#include<iostream>class A
{
public:A() { std::cout << "A:" << size() << std::endl; }virtual int size() { return sizeof(A); }
};
class B : public A
{
public:B() { std::cout << "B:" << size() << std::endl; }virtual int size() { return sizeof(B); }int b;
};
class C : public B
{
public:C() { std::cout << "C:" << size() << std::endl; }virtual int size() { return sizeof(C); }int c;
};int main()                           
{A* p = new C;delete p;return 0;
}

执行结果:

A:4
B:8
C:12

2.1、构造函数的执行顺序
  1. 在派生类中,所有基类构造会被调用。
  2. 上述完成后,初始化vptr。
  3. 如果有初始化列表的话,将初始化列表扩展到构造函数中。
  4. 最后执行程序员提供的代码
3、对象复制

一个类的拷贝复制操作,在以下情况下不会表现出按位拷贝的语意:

  1. 当类中有一个成员,而其有一个拷贝赋值函数时。
  2. 当类有一个基类,而其有一个拷贝赋值函数时。
  3. 当类中声明了一个虚函数时。
  4. 当类有虚基类时,
4、析构

如果类没有定义析构函数,那么只有在类内的成员或基类拥有析构函数时,编译器才会合成一个析构出来。

4.1、析构函数的执行循序
  1. 析构函数本体的代码
  2. 如果成员对象有析构函数,那么他们会以与声明顺序相反的循序执行。
  3. 如果对象内有虚函数,那么重新设之vptr,指向适当的基类的虚表
  4. 如果有任何的非虚基类拥有析构函数,那么以声明顺序相反的顺序执行。
  5. 如果有任何虚基类拥有析构函数,那么他会以构造顺序相反的循序执行

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF学习(6) -- WPF命令和通知

一 、WPF命令 1.ICommand代码 创建一个文件夹和文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace 学习.Command {public class MyCommand : ICommand{Acti…

CCSI: 数据无关类别增量学习的持续类特定印象| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 CCSI: Continual Class-Specific Impression for data-free class incremental learning CCSI: 数据无关类别增量学习的持续类特定印象 01 文献速递介绍 当前用于医学影像分类任务的深度学习模型表现出令人鼓舞的性能。这些模型大多数需要在训练之前收集所有的…

设计模式使用场景实现示例及优缺点(行为型模式——迭代子模式)

迭代子模式&#xff08;Iterator Pattern&#xff09; 迭代子模式&#xff08;Iterator Pattern&#xff09;是一种常用的设计模式&#xff0c;属于行为型模式。它提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。 核心组件 Iterat…

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

在RHEL9.4上启用SFTP服务

FTP存在的不足&#xff1a; 明文传输 FTP传输的数据&#xff08;包括用户名、密码和文件内容&#xff09;都是明文的&#xff0c;这意味着数据可以被网络上的任何人截获并读取。没有内置的加密机制&#xff0c;容易受到中间人攻击。 被动模式下的端口问题 FTP的被动模式需要…

读人工智能全传12人工智能导致的问题1

1. 人工智能会导致什么问题 1.1. 人工智能是一门通用技术&#xff1a;它的应用仅仅受限于我们的想象 1.1.1. 所有的技术都可能产生意想不到的效果&#xff0c;未来几十年甚至几百年内都存在可能性 1.2. 所有的技术都可能被滥用 1.2.1. 我们的无名氏祖先率先用上了火&#x…

大型土木工程项目灾害防御规划与风险评估系统

灾害防御规划更新与维护机制 SELECT DISTINCT 地质灾害类型 FROM 地质灾害信息表;SELECT 地质灾害类型, COUNT(*) AS 发生次数, (COUNT(*) * 100.0 / (

React Native和Swift有什么区别

React Native和Swift在多个方面存在显著的区别&#xff0c;这些区别主要体现在它们的技术基础、应用场景、性能特点、开发效率以及社区支持等方面。 一、技术基础 React Native&#xff1a;是一个由Meta&#xff08;原Facebook&#xff09;开发的开源JavaScript框架&#xff…

编写商品列表和商品编辑和商品新增页面

addvue <template><!-- 传过来的id --> <!-- {{ $route.query.id }} --> <el-formref"FormRef"style"max-width: 600px":model"FormData":rule"rules"status-iconlabel-width"auto"class"demo-r…

Python面试题:在 Python 中,如何处理内存泄漏?

在 Python 中&#xff0c;尽管有垃圾收集器&#xff08;GC&#xff09;来自动管理内存&#xff0c;有时仍可能会出现内存泄漏。内存泄漏通常是由于程序中存在长时间保留不再需要的对象&#xff0c;导致这些对象不能被垃圾收集器回收。以下是处理内存泄漏的一些方法&#xff1a;…

Spring AOP 基础知识

1.背景 按照软件重构的思想&#xff0c;当多个类中存在相同的代码时&#xff0c;需要提取公共部分来消除代码坏味道。Java的继承机制允许用户在纵向上通过提取公共方法或者公共部分(模版方法方式)至父类中以消除代码重复问题&#xff1b;日志、访问控制、性能监测等重复的非业务…

Golang | Leetcode Golang题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; type MyQueue struct {inStack, outStack []int }func Constructor() MyQueue {return MyQueue{} }func (q *MyQueue) Push(x int) {q.inStack append(q.inStack, x) }func (q *MyQueue) in2out() {for len(q.inStack) > 0 {q.outStack…

【web】-sql注入-login

根据网址提示打开如图&#xff1a; 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database&#xff0c;尝试sql注入。 由于post,bp抓包如下&#xff1a; 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…

昇思25天学习打卡营第20天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成个性化音乐 实验简介 MusicGen是Meta AI提出的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量音乐。该模型基于Transformer结构&#xff0c;分为三个阶段&#xff1a;文本编码、音频token预测和音频解码。此实验将演示如何使用MindSpo…

十年期国债收益率

十年期国债收益率是指政府发行的、期限为十年的国债的年化收益率。它被广泛视为一个国家经济健康状况和未来经济前景的重要指标&#xff0c;同时也是金融市场中的一个重要基准利率。 下面我将详细解释十年期国债收益率的相关内容及其意义。 十年期国债收益率的意义 经济健康的…

搞定ES6同步与异步机制、async/await的使用以及Promise的使用!

文章目录 同步和异步async/awaitPromisePromise的概念 同步和异步 ​ 同步&#xff1a;代码按照编写顺序逐行执行&#xff0c;后续的代码必须等待当前正在执行的代码完成之后才能执行&#xff0c;当遇到耗时的操作&#xff08;如网络请求等&#xff09;时&#xff0c;主线程会…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

如何解决VMware 安装Windows10系统出现Time out EFI Network...

一、问题描述 使用VMware 17 安装windows10出现如下图所示Time out EFI Network… Windows10镜像为微软官方下载的ISO格式镜像&#xff1b; 二、问题分析 VMware 17 默认的固件类型是UEFI(E)&#xff0c;而微软官网下载的Windows10 ISO格式镜像不支持UEFI(E)&#xff0c;支…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构④ | 4.7

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.7 安全架构 4.7.1 安全威胁 4.7.2 定义与范围 4.7.3 整体架构设计 4.7.4 网络安全架构设计 4.7.5 数据库系统安…