侯捷C++课程学习笔记:构造函数那些事儿(四)
C++ 构造函数全面解析

上图节选自爱吃喵的鲤鱼
一、构造函数基础特性
1. 核心功能定位
- 对象初始化中枢:负责在对象创建时完成成员变量的初始化工作
- 生命周期唯一性:每个对象在其生命周期内仅被调用一次,类似出生证明的签发过程
2. 基础语法特征
- 命名强制规范:必须与类名完全相同,无法自定义函数名称
- 无返回值声明:不写
void等任何返回类型标识符
二、构造函数类型详解
1. 默认构造函数
- 无参构造规则:当类中未显式定义任何构造函数时,编译器自动生成空实现版本
- 显式定义场景:类包含引用成员或类成员对象没有默认构造时,必须手动定义
- 特殊初始化:C++11支持类内成员变量直接赋默认值,与默认构造函数配合使用
2. 参数化构造函数
- 重载机制:支持通过不同参数组合创建对象,实现多种初始化方式
- 默认参数支持:允许参数设置默认值,如
Point(int x=0, int y=0) - 隐式转换风险:单参数构造函数可能导致意外类型转换,需用
explicit关键字修饰
3. 拷贝构造函数
- 深拷贝要求:当类包含指针或动态资源时,必须自定义拷贝构造实现深度复制
- 调用时机:对象作为函数参数传递、函数返回对象、显式拷贝构造时触发
- 默认浅拷贝:编译器生成的默认版本执行成员级复制,可能引发双重释放问题
4. 移动构造函数(C++11)
- 右值引用语法:使用
&&接收即将销毁的临时对象 - 资源转移优化:直接接管临时对象资源,避免不必要的拷贝开销
noexcept保证:必须声明为不抛异常,确保标准容器操作的安全性
5. 委托构造函数
- 代码复用机制:允许构造函数调用同类其他构造,形成初始化链
- 执行顺序规则:被委托构造先执行初始化,委托构造体后执行
- 循环检测:编译器会阻止构造器之间的循环委托调用
6. 类型转换构造
- 单参构造特性:支持从参数类型到类类型的隐式转换
explicit限制:强制要求显式构造,避免意外转换导致的逻辑错误
三、特殊构造场景
1. 继承体系构造
- 基类初始化:派生类构造函数必须通过初始化列表显式调用基类构造
- 虚继承处理:虚基类的构造由最底层派生类直接负责初始化
2. 异常处理机制
- 资源回滚:构造函数抛出异常时,已构造成员会自动析构
- 半成品对象:异常导致构造中断时,不会调用对象析构函数
3. 纯虚类构造
- 抽象类支持:即使包含纯虚函数,仍可定义构造函数完成基础初始化
- 派生类约束:纯虚类的派生类必须实现所有纯虚函数才能实例化
四、最佳实践准则
1. 初始化列表优先
- 效率优势:直接初始化成员变量,避免先默认构造再赋值的开销
- 强制使用场景:常量成员、引用成员、无默认构造的类成员必须使用
2. 拷贝控制三原则
- 三位一体规则:自定义拷贝构造时必须同时定义拷贝赋值运算符和析构函数
3. 移动语义优化
- 资源管理类必备:对持有文件句柄、网络连接等资源的类实现移动语义
std::move应用:明确标识可移动对象,触发移动构造/赋值
4. 构造异常安全
- 资源申请分离:在构造完成前避免执行可能抛出异常的操作
- 智能指针辅助:使用
unique_ptr等管理资源,确保异常时自动释放
五、现代C++扩展
1. 聚合初始化(C++11)
- 简化结构体初始化:允许通过花括号列表直接初始化公有成员
- 限制条件:类没有用户声明构造、没有基类、没有虚函数
2. constexpr构造(C++11)
- 编译期构造:声明为
constexpr的构造函数可在编译阶段执行 - 字面值类型:用于创建可在编译期确定值的常量表达式对象
3. 推导指引(C++17)
- 模板类支持:指导编译器进行类模板参数推导
- 自定义规则:通过
deduction-guide语法指定推导逻辑
构造函数设计思维
- 最小化原则:每个构造器只完成单一明确的初始化任务
- 防御性编程:对输入参数进行有效性校验,特别是指针和索引值
- 文档化约束:通过注释明确各构造器的使用场景和参数限制
- 性能可视化:对高频使用的构造器进行性能剖析和优化
- 跨API安全:公开接口中的类构造器需考虑二进制兼容性问题
相关文章:
侯捷C++课程学习笔记:构造函数那些事儿(四)
C 构造函数全面解析 上图节选自爱吃喵的鲤鱼 一、构造函数基础特性 1. 核心功能定位 对象初始化中枢:负责在对象创建时完成成员变量的初始化工作生命周期唯一性:每个对象在其生命周期内仅被调用一次,类似出生证明的签发过程 2. 基础语…...
Java 序列化和反序列化为什么要实现Serializable接口
1. 什么是序列化和反序列化 序列化:将对象的状态信息转换为可以存储或传输的形式(通常是字节序列)的过程。例如,将一个 Java 对象保存到文件中或者通过网络发送给其他程序。 反序列化:将字节序列恢复为对象的过程。比…...
java虚拟机(JVM)以及各种参数详解
Java 虚拟机(JVM)提供了许多参数来调整其行为和性能,以便更好地适应不同的应用场景。理解和使用这些参数对于优化 Java 应用程序的性能非常重要。以下是一些常用的 JVM 参数及其详细说明: 1. 内存管理参数 -Xms<size>&…...
微信小程序审核失败,你的小程序涉及提供播放、观看等服务,请补充选择:文娱-其他视频类目 解决
之前审核的都没有什么问题,结果这次就不给过还提示我们这个。 我们的视频是操作演示的视频。仅用于介绍使用。 是否接受修改指引,勾选我不理解以上内容 再勾选 下面不理解内容异项 申诉理由 视频播放和观看只限于当前用户自己使用,而视…...
电力行业研究系列报告
欧洲风能:2024年统计数据及2025-2030年展望 固态电池全景图:方兴未艾,技术竞逐 电力设备新能源2025年3月投资策略:固态电池产业加速推进,关注GTC大会HVDC电源产品应用趋势 62页PPT了解国内外40家固态电池典型企业技…...
蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…...
苹果iOS 18.4将强制升级HomeKit架构,旧版设备或无法使用
在科技飞速发展的当下,智能家居领域也在不断革新。而苹果公司作为科技行业的巨头,其每一次动作都备受关注。近日,有消息称苹果计划在iOS 18.4版本中停止对旧版HomeKit架构的支持,这一举措意味着用户将被迫升级,也可能对众多使用Apple Home应用的智能家居设备用户产生深远影…...
dit block部分
我首先会仔细阅读用户指令,明确用户的需求是基于文章的前十页内容,对3.2节“Diffusion Transformer Design Space”中的“DiT block design”部分进行原文翻译,并且在翻译完成后进行总结。为了完成这个任务,我需要先定位到文章的3…...
在MATLAB中实现PID控制仿真
在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例: 方法1:使用MATLAB脚本编程(基于控制系统工具箱) 步骤1:定义被控对象的数学模型 假设被控对象是…...
ChebyKAN0、ChebyKAN1 网络阅读
目录 ChebyKAN0 Chebyshev Polynomial-Based Kolmogorov-Arnold Networks: An Efficient Architecture for Nonlinear Function Approximation 参考文献 文章内容 文章详细结构 5. Experiments and Results 5.1 Digit Classification on MNIST 5.2 Function Approximat…...
Python核心模块的高级用法及Linux系统常用命令
一、Python相关 1、正则表达式 (1)正则表达式基础 ①含义:记录文本规则的代码。 ②注意:需要导入re模块 ③特点: 语法比较复杂,可读性较差。通用性很强,适用于多种编程语言 ④步骤&#…...
Spring 框架学习
技术体系结构 总体技术体系 单一架构 一个项目,一个工程,导出为一个 war 包,在一个 Tomcat 上运行,也叫 all in one。 单一架构,项目主要应用技术框架为:Spring、SpringMVC 、Mybatis。 分布式架构 一个…...
Python使用总结之深入理解 asyncio.Future——Python 异步编程的核心基石
深入理解 asyncio.Future:Python 异步编程的核心基石 在现代异步编程中,asyncio.Future 对象是 Python 异步生态系统的底层核心组件之一。它不仅是 Task 的基类,更是所有异步操作结果的统一抽象容器。本文将深入探讨它的设计哲学、运作机制和…...
ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题
最近遇到情况,解压工程报错,无法创建软连接 但是盘内还有130G空间,明显不是空间问题,查找之后发现是移动硬盘的文件格式是NTFS,在ubuntu上不好兼容,于是报错。 开贴记录解决方案。 1.确定文件格式 使用命…...
pydub AudioSegment入门(基于Pyhton3)
目录 简介核心功能安装与依赖基本用法加载音频文件导出音频文件音频基础操作 简介 pydub 是一个简单易用的 Python 音频处理库,专注于提供高层次的音频操作接口,而 AudioSegment 是它的核心类,用于表示音频片段(如 MP3、WAV、OGG…...
Python精进系列:filter 模块
Python filter 函数:数据筛选的利器 目录 Python filter 函数:数据筛选的利器引言一、filter 函数概述1.1 定义与基本语法1.2 返回值 二、简单示例:筛选偶数2.1 定义过滤函数2.2 使用 filter 函数进行筛选 三、使用 lambda 表达式简化代码3.1…...
LLM预训练过程-简明版本
文章总结自视频:【1080P】安德烈卡帕西:深入探索像ChatGPT这样的大语言模型|Andrej Karpathy_哔哩哔哩_bilibili 1. 准备训练集 详细的数据集准备方法可参考视频,或者huggingFace 2. 分词(Tokenizer) …...
浅拷贝和深拷贝AI
值传递,在vue3中深拷贝的解决方法 1. 浅拷贝使用结构赋值使用 Object.assign 2. 深拷贝使用 JSON.parse(JSON.stringify())使用 Lodash 的 cloneDeep使用递归函数手动实现深拷贝 3. 使用 Vue 3 的响应式系统相关工具使用 toRaw使用 markRaw 4. 使用第三方库使用 str…...
mingw32编译ffmpeg
ffmpeg https://gitee.com/mirrors/ffmpeg.git 使用msys2的mingw32 pacman -S mingw-w64-x86_64-toolchain compile ./confiure --enable-static --disable-shared --enable-gpl --target-oswin32 mingw32-make -j4 提示编译错误,msys2里面的路径是/d/tools/msys2…...
MAVEN解决版本依赖冲突
文章目录 一、依赖冲突概念1、什么是依赖冲突2、依赖冲突的原因3、如何解决依赖冲突 二、查看依赖冲突-maven-helper1、安装2、helper使用1、conflicts的阅读顺序(从下向上看)2、dependencies as List的阅读顺序(从下向上看)3、de…...
地基注解@Controller和@RestController区别
前记:基础啊,区别点重点理解; 在Spring和Spring Boot框架中,Controller和RestController都用于处理HTTP请求,但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明: 1. 核心区别 特性C…...
Linux Bash 单命令行解释 | 文件操作 / 字符串操作 / 重定向
注:本文为 “Linux Bash” 相关文章合辑。 中文引文,未整理。 英文引文,机翻未校。 第一部分:文件操作 1. 清空文件(清除文件大小为 0) $ > file这行命令使用输出重定向操作符 >。输出重定向造成文…...
【零基础入门unity游戏开发——进阶篇】Unity Microphone类处理麦克风相关信息,录制音频并实时处理或保存录制的音频数据
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
在终端中用code命令打开vscode并加载当前目录了
注册code命令 启动 VSCode 编辑器,按 shift command p输入 shell command,选择 Install ‘code’ command in PATH 选项, 安装code 命令 此操作会把 code 命令添加到系统的环境变量里。 打开 iTerm2 终端 在 iTerm2 中,cd 代码库根目录, …...
无需 Docker 也能下载镜像!轻松获取 Docker 镜像文件!
背景问题 在日常开发或运维工作中,我们经常需要下载 Docker 镜像,但可能会遇到以下问题: 🔹 服务器无法访问 Docker Hub,导致 docker pull 失败。 🔹 Windows 端没有安装 Docker,但仍然需要获…...
ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展
今天向大家介绍的这篇文章题目为:“Protein−Peptide Docking with ESMFold Language Model”,近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略,评估其在预测蛋白质-肽相互作用方面的性能&a…...
win终端添加git-bash,支持linux的shell语法
git的git-bash支持很多linux的语法,比如ll,rm等等,用着很方便,比cmd、ps用着习惯 点击下箭头,设置 添加新配置 配置 地址为git地址\bin\bash.exe,不要用根目录的git-bash.exe,这个会打开新弹窗后…...
wpf中DataGrid组件每一行的背景色动态变化
背景描述:存在多个轧辊,其中有的轧辊是成对的,成对的辊ROLL_NO这个变量的值相同,有的轧辊是单个暂时没有配对的。成对的辊北京颜色交替突出显示,单个辊不需要设置背景色。 实现: 换辊的时候给成对的辊分配相…...
002-告别乱码-libiconv-C++开源库108杰
本课文包含三个视频! 为什么中文版Windows是编程出现乱码的高发地带?怎么用 libiconv 把国标编码的汉字转换成宇宙统一码?怎么简化 libiconv 那些充满坑的 纯C 函数API? 1. 安装 libiconv 通常,你在 MSYS2 中安装过 G…...
DeepSeek赋能智慧交通:城市交通流量智能预测与优化,开启智能出行新时代
在数字化转型的浪潮中,智慧交通正成为提升城市运行效率、改善居民出行体验的关键领域。 DeepSeek作为人工智能领域的前沿技术,凭借其强大的数据分析、智能决策和多模态交互能力,正在为智慧交通注入新的活力,推动交通管理从“经验…...
