构造函数语意学(The Semantics of Constructors)
1、“Default Constructor” 的构造操作
下面4种情况编译器会生成默认构造函数:
- 成员类对象带有默认构造函数
- 父类带有默认构造函数
- 带有虚表的类
- 带有虚基类的类
1.1、 成员类对象带有默认构造函数
如果一个类没有任何构造函数,但它的一个成员对象带有默认构造函数,
那么编译器会在需要的时候为这个类生成默认构造函数。
举个例子,下面的程序中,编译器会为Bar生成一个默认构造。
class Foo
{
public:Foo(){}
};class Bar
{
public:Foo foo;int no;
};void foo_bar()
{Bar bar;//Bar::foo 在这里初始化...
}
生成的构造函数看起来像下面这样:
Bar::Bar()
{foo.Foo::Foo();
}
如果class Bar提供了一个构造函数并初始化no,像下面这样:
Bar::Bar()
{no=0;
}
则编译器会将foo的构造安插到用户代码(也就是no=0)的前面。像下面这样
Bar::Bar()
{foo.Foo::Foo();no=0;
}
如果类中有多个成员对象包含默认构造,那么编译器则按照成员声明顺序依次插入成员对象的默认构造。
1.2 父类带有默认构造函数
类似的道理,如果一个类没有定义任何构造函数,而他的父类含有默认构造。编译器则在需要的时候给这个类生成一个默认构造,用以调用父类的默认构造。
1.3、带有虚表的类
下面代码中class shape中定义了一个虚函数show()
class shape
{
public:virtual void show(){}
};
下面两个扩展行动会在编译期产生
- 编译器生成一个虚函数表,用于存放虚函数的地址
- 一个指向虚函数表的指针会安插在 shape中
为此,编译器会为shape生成一个默认构造,用于设置vptr的值。
1.4、带有虚基类的类
与虚函数类似。如果一个类存在虚基类,编译器会为生成一张虚基类表用以存放所有的虚基类,会在类中安插一个虚基类表指针指向虚基类表。
如果这个类没有任何构造,编译器则会生成一个默认构造,用于正确设置虚基类表指针。
2、“Copy Constructor”的构造操作
下面4种情况,编译器在需要的时候会生成拷贝构造:
- 当类中含有一个成员对象,而后者有一个拷贝构造
- 当class继承一个父类,而后者有一个拷贝构造
- 类中声明了一个或多个虚函数
- 有一个或多个虚基类
2.1、类中声明了一个或多个虚函数
下面代码定义了两个类Animal和Beer。
class Animal
{
public:virtual void draw(){...}
};class Beer :public Animal
{
public:void draw(){...}
};
第一种情况:
Beer a
Beer b = a;
因为a和b的vptr指向的是同一张虚函数表,所以这里可以直接按位拷贝,不需要生成拷贝构造。
第二种情况:
Beer a
Animal b = a;
因为Beer和Animal拥有不同的虚函数表,这里实行按位拷贝会有问题。这是编译器会为Animal生成拷贝构造,用以正确的设置vptr。
2.2、有一个或多个虚基类
和带有虚函数的情况类似。如果相同类型之间的初始化,使用按位拷贝就绰绰有余了。如果以派生类对象作为基类的初始值时(或相反),编译器会生成默认拷贝构造,用以正确设置虚基类指针。
3、成员初始化列表
以下4种情况必须使用初始化列表
- 初始化一个引用成员时
- 初始化一个const成员时
- 调用父类构造,而它拥有参数
- 调用成员对象的构造,而它拥有参数
初始化列表是按照成员声明的顺序执行的,下面是一个常见的错误:
class X
{
public:X(int val):j(val),i(j){}
private:int i;int j;
};
X()中会先设置i的值,由于这时 j 还是未定义的,所以 i 被赋予了一个无效值。
转换后的X()像下面这样:
X(int val)
{i = j; //这里 j 还没有初始化。j = val;...
}
相关文章:
构造函数语意学(The Semantics of Constructors)
1、“Default Constructor” 的构造操作 下面4种情况编译器会生成默认构造函数: 成员类对象带有默认构造函数父类带有默认构造函数带有虚表的类带有虚基类的类 1.1、 成员类对象带有默认构造函数 如果一个类没有任何构造函数,但它的一个成员对象带有…...
香橙派5plus上跑云手机方案二 waydroid
前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案,这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行,但是体验下来只能用软件加速,无法使用GPU加速,所有会很卡。而且…...
600Kg大载重起飞重量多旋翼无人机技术详解
600Kg大载重起飞重量的多旋翼无人机是一种高性能的无人驾驶旋翼飞行器,具有出色的载重能力和稳定的飞行特性。该无人机采用先进的飞行控制系统和高效的动力系统,能够满足各种复杂任务的需求,广泛应用于物资运输、应急救援、森林防火等领域。 …...
LlamaFactory可视化微调大模型 - 参数详解
LlamaFactory 前言 LLaMA Factory 是一个用于微调大型语言模型的强大工具,特别是针对 LLaMA 系列模型。 可以适应不同的模型架构和大小。 支持多种微调技术,如全参数微调、LoRA( Low-Rank Adaptation )、QLoRA( Quantized LoRA )等。 还给我们提供了简单实用的命令行…...
最新 Kubernetes 集群部署 + flannel 网络插件(保姆级教程,最新 K8S 版本)
资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…...
C语言笔记31 •单链表经典算法OJ题-3.反转链表•
反转链表 1.问题 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。 2.代码实现: //3.反转链表 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int …...
网桥与以太网交换机:功能与区别解析
在传统的共享式局域网中,所有站点共享一个公共的传输媒体。随着局域网规模的扩大、网络中站点数目的不断增加,这样的网络通信负载加重,网络效率急剧下降。随着技术的发展、交换技术的成熟和成本的降低,具有更高性能的交换式局域网…...
动态引用的艺术:在Postman中实现自动化的终极指南
🌀 动态引用的艺术:在Postman中实现自动化的终极指南 在API开发和测试中,Postman是一个强大的工具,它提供的动态引用功能可以帮助我们实现自动化和更高效的测试流程。本文将深入探讨如何在Postman中使用动态引用,通过…...
Qt:15.布局管理器(QVBoxLayout-垂直布局、QHBoxLayout-水平布局、QGridLayout-网格布局、拉伸系数,控制控件显示的大小)
目录 一、QVBoxLayout-垂直布局: 1.1QVBoxLayout介绍: 1.2 属性介绍: 1.3细节理解: 二、QHBoxLayout-水平布局: 三、QGridLayout-网格布局: 3.1QGridLayout介绍: 3.2常用方法:…...
图论---无向图中国邮路的实现
开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质: 程序流程图: 数学原理: 本质上是找到一条欧拉回路,考虑图中的边权重、顶点的度数以及如何通过添加最少的额外边来构造欧拉回路,涉及到欧…...
Rockchip RK3588 - Rockchip Linux SDK脚本分析
---------------------------------------------------------------------------------------------------------------------------- 开发板 :ArmSoM-Sige7开发板eMMC :64GBLPDDR4 :8GB 显示屏 :15.6英寸HDMI接口显示屏u-boot &a…...
【C++中resize和reserve的区别】
1. resize的用法 改变当前容器内含有元素的数量(size())比如: vector<int> vct;int num vct.size();//之前的元素个数为num vct.resize(len);//现在的元素个数为len如果num < len ,那么容器vct新增len - num个元素&am…...
计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
本论文的主要研究内容如下: 了解基于Spark的TapTap游戏数据分析系统的基本架构,掌握系统的开发方法,包括系统开发基本流程、开发环境的搭建、测试与运行等。 主要功能如下: (1)用户管理模块:…...
Python面试题:如何在 Python 中进行正则表达式操作?
在 Python 中,正则表达式操作可以通过 re 模块来实现。以下是一些常用的正则表达式操作和示例: 1. 导入模块 import re2. 常见操作和示例 a. 匹配 使用 re.match() 来检查字符串的开头是否匹配某个模式。 pattern r\d # 匹配一个或多个数字 strin…...
C#面:简述什么是中间件(Middleware)?
中间件是组装到应⽤程序管道中以处理请求和响应的软件。 每个组件: 选择是否将请求传递给管道中的下⼀个组件。 可以在调⽤管道中的下⼀个组件之前和之后执⾏⼯作。 请求委托(Request delegates)⽤于构建请求管道,处理每个HTTP请…...
AWS Glue 与 Amazon Redshift 的安全通信配置
1. 引言 在 AWS 环境中,确保服务间的安全通信至关重要。本文将探讨 AWS Glue 与 Amazon Redshift 之间的安全通信配置,特别是为什么需要特定的安全组设置,以及如何正确实施这些配置。 2. 背景 AWS Glue:全托管的 ETL(提取、转换、加载)服务Amazon Redshift:快速、完全…...
nginx访问控制
最近部署consul服务,发现consul认证配置比较麻烦,于是上网查询发现nginx支持路由认证,在此做个记录。 1.Nginx访问控制模块类型 基于IP的访问控制:http_access_module基于用户的信任登录:http_auth_basic_module 2.…...
高效应对网络攻击,威胁检测响应(XDR)平台如何提升企业应急响应能力
在数字化时代,企业面临的网络攻击威胁持续增加,如恶意软件、勒索软件、钓鱼攻击、DDoS攻击等。这些威胁不仅危及企业数据安全、系统稳定,还损害了品牌形象和市场信任。随着云计算、大数据、物联网的广泛应用,企业网络攻击面扩大&a…...
多线程问题
什么是线程 线程是cpu调度和执行的单位,一个程序的运行伴随着的是一个进程的执行,而一个进程是由一个或多个线程来完成的,通过cpu调度资源在很短时间切换主线程和子线程并行,交替执行来做到看似多个线程同时进行的状态࿰…...
自动优化:SQL Server数据库自动收缩配置指南
自动优化:SQL Server数据库自动收缩配置指南 在数据库管理中,随着数据的增删,数据库文件的大小会不断变化,导致空间浪费和性能下降。SQL Server提供了自动收缩功能,帮助数据库文件保持最佳状态。本文将深入探讨如何在…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
