深度探索C++对象模型 之 构造函数语意学

航空大数据——项目资源汇总及开源(四) ADS-B项目开源大礼包 阅读详情

explicit被引入C++是为了使程序员能够制止“单一参数的constructor函数”被当做一个conversion 运算符。

有四种情况:

1.带有default constructor 的member classobject

2.带有default constructor 的base class

3.带有一个virtual function 的class

4.带有一个virtual base class 的class

会导致“编译器必须为未声明constructor 之classes 合成一个default constructor(或copy constructor) ”。C++ Stardand 把那些合成物称为implicit nontrivial default constructors(或copy constructor)。被合成出来的constructor 只能满足编译器(而非程序)的需要。它之所以能够完成任务,是借着“调用member object 或 base class 的default constructor(或copy constructor)”或是“为每一个object初始化其virtual function 机制或virtual base class 机制”而完成。至于没有存在那四种情况而又没有声明任何constructor的classes,我们说它们拥有的是implicit trivial default constructors(或copy constructor),它们实际上并不会被合成出来。

 

在合成的default constructor(或copy constructor)中,只有 base class subobjects 和member class objects 会被初始化。所有其它的nonstatic data member,如整数,整数指针,整数数组等等都不会被初始化。这些初始化操作对程序而言或许有需要,但对编译器则非必要。如果程序需要一个“把某指针设为0”的default constructor,那么提供它的人应该是程序员。

 

 

C++新手一般有两个常见的误解:

1.任何class如果没有定义default constructor,就会被合成出一个来。

2.编译器合成出来的default constructor 会明确设定“class内每一个data member 的默认值”。

但如你所见,没有一个是真的!

 

对于copy constructor,后两种情况有些不同:

它们发生在当一个base class object以其derived class的object内容
做初始化操作时,

其vptr和virtual base class pointer/offset复制操作也必须保证安

全,所以会合成出一个

copy constructor 来做这件事。

 

Member initialization list被使用于下面四种情况:

1.当初始化一个reference member 时

2.当初始化一个const member 时

3.当调用一个 base class 的constructor,而它拥有一组参数时

4.当调用一个member class 的constructor,而它拥有一组参数时

 

执行顺序是先调用基类的构造函数,然后按照成员的声明顺序执行在
member initialization list中

进行初始化,最后执行构造函数主体
部分。
芒果YOLO11改进145:Loss损失函数KLD:即插即用 NeurIPS顶会论文,独家首发原创新颖|通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框 旋转检测Loss损失函数KLD:即插即用 NeurIPS顶会论文,独家首发原创新颖|通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框 阅读详情

相关推荐

RH850_U2A系列HSM安全核开启但是固件未烧录导致无法启动也无法再烧入固件废板问题分析解决

hsm核导致的安全锁死补救方案

u011941262的博客 1735

[读书笔记] - 《深度探索C++对象模型》第2章 构造函数语意学

1.Default Constructor的建构操作 1.1C++ Annotated Reference Manual(ARM)中的Section12.1告诉我们:“default constructor...在需要的时候被编译器产生出来”。 class Foo { public: int val; Foo *pnext; }; void foo_bar() { // oops: 程序要求bar's members都被清为0 Foo bar; if(bar.val || .

浮生的博客 339

MCU中GPIO口的驱动方式

MCU中GPIO口的驱动方式 导读: MCU芯片中GPIO口的驱动方式大的可分为输出和输入两类,小的分可以分为8种。 一、四种输入方式 ①上拉输入: 上拉输入抗干扰能力强,特别适合接地信号的输入(比如低电平有效的按键信号输入)。其工作原理如图1所示。 I/O 端口与TTL 施密特触发器之前接入了一个30K~50K 欧姆的上拉电阻,当I/O 端口悬空时,此时MCU 也能读到稳定的高电平状态,...

优快云Frewen的博客 3375

深度探索C++ 对象模型--构造函数语意学(阅读笔记)(原创)

深度探索C++ 对象模型(阅读笔记)(原创) Inside The C++ Object Model                                                                --构造函数语意学由 王宇 原创并发布 : 让我肃然起敬并崇拜的牛人:       Bjarne Stroustrup    -  C++之父    (www....

MrWangyu的专栏 370

宏杉MacroSan存储开局指导-流程

目录 1. 导入ODSP授权 2.1.版本确认 2.2.存储设备升级U盘、升级光盘制作方法 开局流程如下: 1. 导入ODSP授权 ODSP授权文件随设备附带,拆箱可见 2.1.版本确认 java模式 html模式 2.2.存储设备升级U盘、升级光盘制作方法 准备工具 空白U盘: 1个,容量要求大于等于4GB。仅制作升级U盘时需要。 制作升级U盘步骤 1.将U盘插入PC机USB口,保证PC机能识别到U盘。 2.运行UltraISO,选择菜单中的 文件-&g...

飞天板砖 4281

OpenClaw + Ollama 本地大模型部署教程:彻底告别Token焦虑

OpenClaw + Ollama 本地大模型部署教程:彻底告别Token焦虑

leaning_java的博客 1229

深度探索C++对象模型(2):构造函数语意学

构造函数语意学构造函数语意学Default Constructor的构造操作"带有Default Constructor"的Member Class Object"带有Default Constructor"的Base Class"带有一个Virtual Function"的Class"带有一个Virtual Base Function"的ClassCopy Constructor的构造操作Default Memberwise InitializationBitwise Copy Semantics(位逐次

遇事不决,问春风 655

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2188

深度探索C++对象模型(二):构造函数语意学

Default Constructor的构造操作 C++编译器在以下4种情况默认构造函数被认为是nontrivial的,需要被合成出来。 含有类对象数据成员,该类对象类型有默认构造函数。 class A { public: A(bool _isTrue=true, int _num = 0){ isTrue = _isTrue; num = _num; }; //默认构造函数 bool isTrue; int num; }; class B { public: A

youaremyalllove的博客 917

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5866

CPU、Core、RISC、ARM等的前世今生

CPU、Core、RISC-V 、ARM、ASIC、FPGA、SOC概念及区分

nxin168的博客 1017

【深度探索C++对象模型】(2)构造函数语意学

1.Default Constructor的构造操作 默认构造函数是在编译器需要的时候构建出来的,被合成的默认构造函数只执行编译器所需的动作。被合成的默认构造函数中只有base class subobjects以及member class objects会被初始化,而其他nonstatic data member(如整数、指针、数组)都不会初始化,因为他们是满足程序需要的。 有四种情况会使得编译器...

RaKiRaKiRa的博客 317

从零训练Qwen3-VL

如果你未来想做的是「在公开权重上继续做大规模多模态 pretrain(比如换数据、换目标函数)」而不是在完全随机初始化上起步,这两类代码会比 Open-Qwen2VL 更直接。参考 Qwen2-VL / Qwen2.5-VL 披露的流程,可以大致推测 Qwen3-VL 也是类似的三阶段:(直接在学术算力(8×A100-40G)上从零预训练了一个 2B 参数的多模态 Qwen2-VL 风格模型:(的配置和训练脚本,理解它是如何把「任意 ViT + 任意 LLM + 任意图文数据」拼在一起的。

u013250861的博客 566

《深度探索C++对象模型》笔记目录

读书笔记,特此记录。 😇😇😇 《深度探索C++对象模型》阅读笔记 第一章 关于对象 《深度探索C++对象模型》阅读笔记 第二章 构造函数语意学 《深度探索C++对象模型》阅读笔记 第三章 Data语意学 《深度探索C++对象模型》阅读笔记 第四章 Function语意学 《深度探索C++对象模型》阅读笔记 第五章 构造、解构、拷贝语意学 《深度探索C++对象模型》阅读笔记 第六章 执行期语意学 《深度探索C++对象模型》阅读笔记 第七章 站在对象模型的尖端...

哇咔咔的博客 364

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《深度探索C++对象模型》- 第2章 构造函数语意学

关于C++编译器背着程序员做了太多事情,说的应该就是构造函数的问题。比较难懂的就是“default constructors … 在需要的时候被编译器产生出来”。重点是“在需要的时候”。但看完以后觉得也是比较合理的。 2.1 Default Constructor 的建构操作 1. 如果class的一个成员变量有自己的default constructor,总是要让人家执行一下的。如果class没有默认构造函数,就造一个空壳子然后调用这些自己有默认构造函数的成员变量,如果class有自己的构造函数,这些

山高月小 880

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度探索C++对象模型学习 之 C++构造函数语意学(一)

1.1   讨论编译器是否一定会生成构造函数 提问:程序员定义一个类,但是没有写类的构造函数,这个时候系统是不是会自动生成一个默认的构造函数? 回答:是的,当定义一个类的时候,程序员没有显示的定义一个构造函数,编译器会为我们生成一个默认的构造函数。   请问上面的回答是否正确呢,我想很多程序员都会说是对的,这不是课本上说的么。   但是事实却不是这样,我们举个例子吧!   #inc

u011353748的专栏 737

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度探索C++对象模型——2_构造函数语意学

深度探索C++对象模型

wogan101的博客 220

深度探索C++对象模型 2构造函数语意学

第二章 构造函数语意学 本章大量出现的英语术语: trivial: 没有用的 nontrivial:有用的 memberwise: 对每一个member施以… bitwise: 对每一个bit施以… named return value optimization (NRV) 2.1Default Constructor的构造操作 对于一个类,如果没有任何构造函数的声明,那么会有...

系统 运维 304

深度探索C++对象模型-------构造函数语意学

构造函数语意学

qq_19596293的博客 508

问答学习《深度探索C++对象模型》系列

经过数次翻看《深度探索C++对象模型》和翻看别人的笔记,还是决定自己动手写一下该本书的笔记。笔记采用问答的方式是因为在UC实习时我的指导老师的影响:你不要为了看书而看书,你要从中学到东西就要带着疑问去学习。于是有了这一系列的笔记,感谢我的指导老师让我明白:生命不息,学习不止。 第一章:《深度探索C++对象模型》读书笔记之关于对象 第二章:《深度探索C++对象模型》读书笔记之构造函数语意学 第

冰枫的随笔 1336

《深度探索C++对象模型》阅读笔记 第二章 构造函数语意学

在读《深度探索C对象模型》之前,我一直停留在上述二种误解上,所幸的是 Lippman为我破除了藩篱。下面的部分我将随《深度探索C对象模型》对C++默 认构造函数一探究竟。C++标准规定:如果类的设计者并未为类定义任何构造函数,那么会有一个默认 构造函数被暗中生成,而这个暗中生成的默认构造函数通常是不做什么事的(无 用的),下面四种情况除外。换句话说,有以下四种情况编译器必须为未声明构造函数的类生成一个会做点事 的默认构造函数。我们会看到这些默认构造函数仅“忠于编译器”,而可能不会按 照程序员的意愿程效命。若

哇咔咔的博客 417

《深度探索C++对象模型》—构造函数语意学(The Semantics of constructors)

前言 这一章中,作者将挖掘编译器对于“对象构造过程”的干涉。 构造函数语意学(The Semantics of constructors) Default Constructor 的建构操作 你是否有过如下的错觉: 没有定义默认构造函数的类,编译器都会生成一个默认构造函数。 编译器生成的默认构造函数会明确初始化类中每一个数据成员。 C++标准规定:如果类的设计者并未为类定义任何构造

jiange_zh的博客 1221

《深度探索C++对象模型》第二章构造函数语意学收获

1.究竟是不是每个类都有构造函数 按照C++标准规定,每个类都有显式的或者隐式的构造函数和拷贝构造函数,但是编译器会区分这个类中的构造函数和拷贝构造函数是有用或者无用的,如果判定为有用,编译器就会将这个构造函数生成代码,如果没用,就不会生成代码。(简单来说就是C++规定了每个类都有构造和拷贝构造函数,但是编译器不一定为每个类生成构造或拷贝构造函数,下面的内容都是指编译以后是否是否具有构造函数,所...

qq_34489443的博客 395

《深度探索C++对象模型》--2 构造函数语意学

上一篇: 《深度探索C++对象模型》--1 关于对象 1、default constructor的构造操作    C++standard:对于class X ,如果没有任何user-declared constructor,那么会有一个default constructor 被暗中(implicitly)声明出来,一个被暗中声明出来的default constru

KUAILE123的专栏 1028

【深度探索C++对象模型读书笔记】【第2章】构造函数语意学

一、Default Construct的构造操作 1、 C++ Standard说:对于一个类,如果没有用户定义的构造函数,那么会有一个默认构造函数被隐式声明出来,但这个构造函数是trivial constructor(没啥用的)。 2、 以下4种情况编译器会合成nontrivial default construct: a)  带有default constructor的member cl

ruan875417的专栏 795

深度探索C++对象模型 学习笔记 第二章 构造函数语意学

很多抱怨说C++背着程序员做了太多事,如: if (cin) { /* ... */ } 为了让cin能转换为真假值,为cin定义一个类型转换运算符operator int(),就可以完成以上工作了,但以下行为: cin << intVal; 相当于左移一个int。可以用operator void *()取代operator int()来避免这种情况。而将类型转换运算符声明为explicit的也可以避免。 什么时候需要默认构造函数: class Foo { public: int v

tus00000的博客 856
上一篇: C库函数手册
下一篇: java之旅(一)什么是java
C_plus_learner
博客等级 码龄22年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值