当前位置: 首页 > news >正文

构造函数语意学(The Semantics of Constructors)

1、“Default Constructor” 的构造操作

下面4种情况编译器会生成默认构造函数:

  1. 成员类对象带有默认构造函数
  2. 父类带有默认构造函数
  3. 带有虚表的类
  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(){}
};

下面两个扩展行动会在编译期产生

  1. 编译器生成一个虚函数表,用于存放虚函数的地址
  2. 一个指向虚函数表的指针会安插在 shape中

为此,编译器会为shape生成一个默认构造,用于设置vptr的值。

1.4、带有虚基类的类

与虚函数类似。如果一个类存在虚基类,编译器会为生成一张虚基类表用以存放所有的虚基类,会在类中安插一个虚基类表指针指向虚基类表。
如果这个类没有任何构造,编译器则会生成一个默认构造,用于正确设置虚基类表指针。

2、“Copy Constructor”的构造操作

下面4种情况,编译器在需要的时候会生成拷贝构造:

  1. 当类中含有一个成员对象,而后者有一个拷贝构造
  2. 当class继承一个父类,而后者有一个拷贝构造
  3. 类中声明了一个或多个虚函数
  4. 有一个或多个虚基类
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种情况必须使用初始化列表

  1. 初始化一个引用成员时
  2. 初始化一个const成员时
  3. 调用父类构造,而它拥有参数
  4. 调用成员对象的构造,而它拥有参数

初始化列表是按照成员声明的顺序执行的,下面是一个常见的错误:

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&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.代码实现&#xff1a; //3.反转链表 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int …...

网桥与以太网交换机:功能与区别解析

在传统的共享式局域网中&#xff0c;所有站点共享一个公共的传输媒体。随着局域网规模的扩大、网络中站点数目的不断增加&#xff0c;这样的网络通信负载加重&#xff0c;网络效率急剧下降。随着技术的发展、交换技术的成熟和成本的降低&#xff0c;具有更高性能的交换式局域网…...

动态引用的艺术:在Postman中实现自动化的终极指南

&#x1f300; 动态引用的艺术&#xff1a;在Postman中实现自动化的终极指南 在API开发和测试中&#xff0c;Postman是一个强大的工具&#xff0c;它提供的动态引用功能可以帮助我们实现自动化和更高效的测试流程。本文将深入探讨如何在Postman中使用动态引用&#xff0c;通过…...

Qt:15.布局管理器(QVBoxLayout-垂直布局、QHBoxLayout-水平布局、QGridLayout-网格布局、拉伸系数,控制控件显示的大小)

目录 一、QVBoxLayout-垂直布局&#xff1a; 1.1QVBoxLayout介绍&#xff1a; 1.2 属性介绍&#xff1a; 1.3细节理解&#xff1a; 二、QHBoxLayout-水平布局&#xff1a; 三、QGridLayout-网格布局&#xff1a; 3.1QGridLayout介绍&#xff1a; 3.2常用方法&#xff1a…...

图论---无向图中国邮路的实现

开始编程前分析设计思路和程序的整体的框架&#xff0c;以及作为数学问题的性质&#xff1a; 程序流程图&#xff1a; 数学原理&#xff1a; 本质上是找到一条欧拉回路&#xff0c;考虑图中的边权重、顶点的度数以及如何通过添加最少的额外边来构造欧拉回路&#xff0c;涉及到欧…...

Rockchip RK3588 - Rockchip Linux SDK脚本分析

---------------------------------------------------------------------------------------------------------------------------- 开发板 &#xff1a;ArmSoM-Sige7开发板eMMC &#xff1a;64GBLPDDR4 &#xff1a;8GB 显示屏 &#xff1a;15.6英寸HDMI接口显示屏u-boot &a…...

【C++中resize和reserve的区别】

1. resize的用法 改变当前容器内含有元素的数量&#xff08;size()&#xff09;比如&#xff1a; vector<int> vct;int num vct.size();//之前的元素个数为num vct.resize(len);//现在的元素个数为len如果num < len &#xff0c;那么容器vct新增len - num个元素&am…...

计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设

本论文的主要研究内容如下&#xff1a; 了解基于Spark的TapTap游戏数据分析系统的基本架构&#xff0c;掌握系统的开发方法&#xff0c;包括系统开发基本流程、开发环境的搭建、测试与运行等。 主要功能如下&#xff1a; &#xff08;1&#xff09;用户管理模块&#xff1a…...

Python面试题:如何在 Python 中进行正则表达式操作?

在 Python 中&#xff0c;正则表达式操作可以通过 re 模块来实现。以下是一些常用的正则表达式操作和示例&#xff1a; 1. 导入模块 import re2. 常见操作和示例 a. 匹配 使用 re.match() 来检查字符串的开头是否匹配某个模式。 pattern r\d # 匹配一个或多个数字 strin…...

C#面:简述什么是中间件(Middleware)?

中间件是组装到应⽤程序管道中以处理请求和响应的软件。 每个组件&#xff1a; 选择是否将请求传递给管道中的下⼀个组件。 可以在调⽤管道中的下⼀个组件之前和之后执⾏⼯作。 请求委托&#xff08;Request delegates&#xff09;⽤于构建请求管道&#xff0c;处理每个HTTP请…...

AWS Glue 与 Amazon Redshift 的安全通信配置

1. 引言 在 AWS 环境中,确保服务间的安全通信至关重要。本文将探讨 AWS Glue 与 Amazon Redshift 之间的安全通信配置,特别是为什么需要特定的安全组设置,以及如何正确实施这些配置。 2. 背景 AWS Glue:全托管的 ETL(提取、转换、加载)服务Amazon Redshift:快速、完全…...

nginx访问控制

最近部署consul服务&#xff0c;发现consul认证配置比较麻烦&#xff0c;于是上网查询发现nginx支持路由认证&#xff0c;在此做个记录。 1.Nginx访问控制模块类型 基于IP的访问控制&#xff1a;http_access_module基于用户的信任登录&#xff1a;http_auth_basic_module 2.…...

高效应对网络攻击,威胁检测响应(XDR)平台如何提升企业应急响应能力

在数字化时代&#xff0c;企业面临的网络攻击威胁持续增加&#xff0c;如恶意软件、勒索软件、钓鱼攻击、DDoS攻击等。这些威胁不仅危及企业数据安全、系统稳定&#xff0c;还损害了品牌形象和市场信任。随着云计算、大数据、物联网的广泛应用&#xff0c;企业网络攻击面扩大&a…...

多线程问题

什么是线程 线程是cpu调度和执行的单位&#xff0c;一个程序的运行伴随着的是一个进程的执行&#xff0c;而一个进程是由一个或多个线程来完成的&#xff0c;通过cpu调度资源在很短时间切换主线程和子线程并行&#xff0c;交替执行来做到看似多个线程同时进行的状态&#xff0…...

自动优化:SQL Server数据库自动收缩配置指南

自动优化&#xff1a;SQL Server数据库自动收缩配置指南 在数据库管理中&#xff0c;随着数据的增删&#xff0c;数据库文件的大小会不断变化&#xff0c;导致空间浪费和性能下降。SQL Server提供了自动收缩功能&#xff0c;帮助数据库文件保持最佳状态。本文将深入探讨如何在…...

华为机考真题 -- 密码解密

题目描述&#xff1a; 给定一段"密文"字符串 s, 其中字符都是经过"密码本"映射的&#xff0c;现需要将"密文"解密并且输出映射的规则 &#xff08;a - i)分别用(1 - 9)表示&#xff1b;(j - z)分别用(10* - 26*)表示约束&#xff1a;映射始终唯…...

ScrapySharp框架:小红书视频数据采集的API集成与应用

引言 随着大数据时代的到来&#xff0c;数据采集成为了互联网企业获取信息的重要手段。小红书作为一个集社交和电商于一体的平台&#xff0c;其丰富的用户生成内容&#xff08;UGC&#xff09;为数据采集提供了丰富的资源。本文将介绍如何使用ScrapySharp框架进行小红书视频数…...

PostgreSQL 数据库监控项

在维护和优化 PostgreSQL 数据库时&#xff0c;采集并监控数据库的各种静态和动态指标非常重要。这些指标包括数据库的配置信息、资源使用情况、性能指标等&#xff0c;能够帮助数据库管理员及时发现并解决潜在的问题&#xff0c;从而提高数据库的稳定性和性能。本文提供了一系…...

用python生成词频云图(python实例二十一)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.词频云图 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…...

HTML 标签简写和全称及其对应的中文说明和实例

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML 标签简写及全称</title><style>…...

(2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)

前言 本系列最初的想法就是搭建一个多项目的环境, 包含nginx, nodejs, php, html, redis, MongoDB, mysql.本文使用的PHP镜像为php:7.3.6-apache, 这里可以使用上一篇文章中生成好的镜像.LAMP或包含react或vue的前端项目, 本文就各写了一个, 可以按照实际需求, 自行添加多个容…...

全网最适合入门的面向对象编程教程:13 类和对象的 Python 实现-可视化阅读代码神器 Sourcetrail 的安装使用

全网最适合入门的面向对象编程教程&#xff1a;13 类和对象的 Python 实现-可视化阅读代码神器 Sourcetrail 的安装使用 摘要&#xff1a; 本文主要介绍了可视化阅读代码神器Sourcetrail的安装与使用&#xff0c;包括软件简介和特性、下载地址、安装方式、新建工程和如何查看…...

Django 视图 - FBV 与 CBV

Django 视图 - FBV 与 CBV 在 Django 框架中&#xff0c;视图是处理 Web 请求和返回 Web 响应的核心组件。Django 提供了两种主要的视图编写方式&#xff1a;函数基础视图&#xff08;Function-Based Views&#xff0c;简称 FBV&#xff09;和类基础视图&#xff08;Class-Bas…...

AI机器人在未来的应用场景预测:是否会取代人类?华为、百度、特斯拉他们在AI领域都在做什么?

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI机器人在各个领域的应用变得越来越普遍。从工业自动化到日常生活&#xff0c;AI机器人已经开始展现出强大的潜力和实际应用价值。本文将深入探讨AI机器人在未来的应用场景&#xff0c;并分析它们是否…...

第58期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…...

为什么python不适合开发网站/郑州seo哪家好

本篇文章主要为大家介绍下php如何获取本周的所有日期&#xff0c;或者最近七天的所有日期。希望可以帮助到有需要的朋友#####获取本周所有日期&#xff1a;/*获取本周所有日期*/function get_week($time , $formatY-m-d){$time $time ! ? $time : time();//获取当前周几$we…...

网站集约化建设进度汇报/万网的app叫什么

选择排序就是每次遍历数组找到最大的&#xff0c;然后将最大的和没有排序的部分的最后一个元素进行交换 举例如下&#xff0c; 第一次遍历找到最大的 20&#xff0c;将20 和最后一个元素2 交换&#xff0c;20 现在是已经排好序的了 第二次遍历找到最大的值10&#xff0c;将10 和…...

白玉网站建设/公司做网站一般多少钱

目录 1.foreach元素的属性 2.collection属性值的三种情况 3.代码示例 3.1 collection属性值为List(Array等同): 3.2 collection属性值类型为Map: 1.foreach元素的属性 collection: foreach的对象,作为入参,对象为list、array时&#xff0c;collection属性值分别默认用&quo…...

wordpress 根目录/最新国际消息

亮度和对比度 对RGB色彩图像来讲,亮度越高,像素点对应的RGB值应该越大;亮度越低,像素点对应的RGB值应该越小。而对比度则是用来描述图像颜色与亮度之间的差异感知,对比度越大,图像的每个像素与周围的差异性也就越大,整个图像的细节就越显著;反之亦然。 调整图像亮度和…...

b2b网站开发/2023年东莞疫情最新消息

我相信&#xff0c;有很多小伙伴在看到这篇文章时就有了很多问号&#xff1a;用vim&#xff1f;疯了吧&#xff1f;sublime不香吗&#xff1f;pycharm不香吗&#xff1f;jupyter notebook不香吗&#xff1f;我这可是最新版的windows 100操作系统诶&#xff0c;你要劝我回到Dos/…...

小程序雀神麻将开挂视频/seo兼职

今天有网友对pf的in out 和后面的 a to b 范迷糊&#xff0c;然后举了个例子让他明白假设防火墙是一个学校的门卫室&#xff0c;它是校门与学校里面的教室必经之路&#xff0c; 一个门通向校门外叫$ext_if&#xff0c;另一个门通向学校的教室 $int_if &#xff0c;把自己想像成…...