C++构造函数详解
构造函数详解:C++ 中对象初始化与构造函数的使用

在 C++ 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何参数的情况下,也能保证对象有合理的初始值。本文将详细探讨构造函数的作用、类型、用法,并通过具体的例子来展示如何使用构造函数进行对象初始化。
1. 构造函数的作用
构造函数的主要作用是初始化对象。当我们创建一个对象时,构造函数会被自动调用,给对象的成员变量赋初值。通过构造函数,程序员可以控制对象创建时的初始化过程,确保对象处于合适的状态。
- 对象初始化:构造函数用于给对象的成员变量赋初值。
- 保证一致性:构造函数能确保对象在创建时被初始化为合法状态,避免对象的成员变量处于未定义的状态。
2. 构造函数的类型
构造函数可以根据其是否需要参数,分为两种类型:
- 无参构造函数:不带任何参数,通常用于创建对象时没有特殊初始化需求。
- 带参构造函数:带有一个或多个参数,可以在创建对象时传递特定的初始值。
2.1 无参构造函数
无参构造函数是默认的构造函数,它通常用于给成员变量赋一个通用的默认值。如果没有为对象提供参数,构造函数会被自动调用,初始化对象。
示例:
class Box {
public:int height, width, length;// 无参构造函数Box() {height = 10;width = 10;length = 10;}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1; // 调用无参构造函数box1.display(); // 输出: Height: 10, Width: 10, Length: 10return 0;
}
解释:
- 在这个例子中,
Box类的无参构造函数为height、width和length成员变量赋了默认值10。 - 当
box1对象被创建时,构造函数会被自动调用,并初始化成员变量。
2.2 带参构造函数
带参构造函数允许在对象创建时为成员变量传递初始值。它适用于在创建对象时,需要指定对象属性的场景。
示例:
class Box {
public:int height, width, length;// 带参构造函数Box(int h, int w, int l) {height = h;width = w;length = l;}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box2(15, 20, 25); // 调用带参构造函数box2.display(); // 输出: Height: 15, Width: 20, Length: 25return 0;
}
解释:
- 在此例中,带参构造函数通过
height、width和length三个参数初始化对象的成员变量。 - 通过
box2(15, 20, 25)创建box2对象时,构造函数会自动被调用,并使用提供的参数值初始化成员变量。
3. 使用初始化列表
初始化列表是在构造函数的头部列出对成员变量的初始化方式,这种方式比在构造函数体内赋值更加高效。使用初始化列表,C++ 会直接在对象创建时对成员进行初始化,而不是先分配内存后再赋值。
示例:
class Box {
public:int height, width, length;// 使用初始化列表Box(int h, int w, int l) : height(h), width(w), length(l) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box3(10, 20, 30); // 调用带参构造函数并使用初始化列表box3.display(); // 输出: Height: 10, Width: 20, Length: 30return 0;
}
解释:
Box(int h, int w, int l) : height(h), width(w), length(l)是初始化列表,它直接在对象创建时为成员变量赋值。- 相比于在构造函数体内进行赋值,初始化列表更加高效。
4. 构造函数的重载
构造函数支持重载,即同一个类中可以定义多个构造函数,只要它们的参数列表不同。这样我们就可以根据不同的初始化需求,使用不同的构造函数。
示例:
class Box {
public:int height, width, length;// 无参构造函数Box() {height = 10;width = 10;length = 10;}// 带参构造函数Box(int h, int w, int l) : height(h), width(w), length(l) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1; // 调用无参构造函数Box box2(15, 20, 25); // 调用带参构造函数box1.display(); // 输出: Height: 10, Width: 10, Length: 10box2.display(); // 输出: Height: 15, Width: 20, Length: 25return 0;
}
解释:
Box类定义了两个构造函数:一个无参构造函数和一个带参构造函数。- 在
main函数中,我们可以根据需求选择使用不同的构造函数来初始化对象。
5. 构造函数重载中的歧义性
构造函数重载可能会引发歧义,特别是当构造函数的参数有默认值时。如果调用时参数的数量不确定,编译器可能无法确定调用哪个构造函数。
示例:
class Box {
public:int height, width, length;// 带默认参数的构造函数Box(int h, int w = 10, int l = 10) : height(h), width(w), length(l) {}// 两个参数的构造函数Box(int h, int w) : height(h), width(w), length(10) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1(15); // 产生歧义:调用哪个构造函数?box1.display();return 0;
}
解释:
Box(15)调用时,编译器无法确定调用哪个构造函数,因为Box(int h, int w = 10, int l = 10)和Box(int h, int w)都可以匹配15作为参数。为了避免这种歧义,通常可以明确指定所有参数或避免使用多个带默认值的构造函数。
6. 使用默认参数的构造函数
构造函数可以使用默认参数值,使得在调用时可以选择性地传递参数,而其他参数则使用默认值。这种方式通常非常有用,可以简化代码。
示例:
class Box {
public:int height, width, length;// 带默认参数的构造函数Box(int h = 10, int w = 10, int l = 10) : height(h), width(w), length(l) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1; // 使用默认参数,所有参数都为10Box box2(15); // 使用默认参数,height = 15,其他参数为10Box box3(20, 30); // 使用默认参数,height = 20,width = 30,length = 10box1.display(); // 输出: Height: 10, Width: 10, Length: 10box2.display(); // 输出: Height: 15, Width: 10, Length: 10box3.display(); // 输出: Height: 20, Width: 30, Length: 10return 0;
}
解释:
- 使用默认参数的构造函数,允许在调用时只传递部分参数,而其他参数则使用默认值。
7. 总结
构造函数是 C++ 中非常重要的一部分,它帮助我们初始化对象的状态,确保对象在创建时处于一个有效的状态。通过理解无参构造函数、带参构造函数、初始化列表、构造函数重载等内容,我们可以更加灵活地使用构造函数来创建和初始化对象。
- 无参构造函数:用于给对象赋予默认值。
- 带参构造函数:用于传递特定的初始值。
- 初始化列表:更高效的成员初始化方式。
- 构造函数重载:根据不同的初始化需求,选择合适的构造函数。
- 默认参数:通过使用默认参数简化对象创建的代码。
希望通过这篇文章,您能更好地理解 C++ 中构造函数的用法,并能够在实际编程中灵活应用构造函数来初始化对象。
相关文章:
C++构造函数详解
构造函数详解:C 中对象初始化与构造函数的使用 在 C 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何…...
POI实现根据PPTX模板渲染PPT
目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…...
【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看
文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...
树的直径计算:算法详解与实现
树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...
conda创建 、查看、 激活、删除 python 虚拟环境
1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all 助力快速掌握数据集…...
vs2022搭建opencv开发环境
1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...
NVIDIA NIM 开发者指南:入门
NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...
探索Python网络请求新纪元:httpx库的崛起
文章目录 **探索Python网络请求新纪元:httpx库的崛起**第一部分:背景介绍第二部分:httpx库是什么?第三部分:如何安装httpx库?第四部分:简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...
学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着
ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...
QQ 小程序已发布,但无法被搜索的解决方案
前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规…...
【C++】拷贝构造 和 赋值运算符重载
目录: 一、拷贝构造 (一)拷贝函数的特点 二、赋值运算符重载 (一)运算符重载 (二)赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何…...
21.UE5游戏存档,读档,函数库
2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…...
「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
本篇将继续讲解PTA平台上的题目 L1-005 考试座位号,通过考生准考证号与座位号的对应关系,掌握简单的数据查询与映射操作,进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…...
Vue3引用高德地图,进行位置标记获取标记信息
首先安装地图插件 cnpm i amap/amap-jsapi-loader --save封装地图子组件 <template><el-dialogtitle"选择地点"width"740px"class"select-map-dialog"v-model"dialogShow":close-on-click-modal"false":modal-or…...
《C++设计模式:重塑游戏角色系统类结构的秘籍》
在游戏开发领域,游戏角色系统的类结构设计至关重要。一个良好的类结构可以使游戏更易于扩展、维护和优化,而 C中的设计模式为我们提供了强大的工具来实现这一目标。 一、理解游戏角色系统的复杂性 游戏角色系统通常具有高度的复杂性。每个角色都有自己…...
深入浅出 Go 语言:现代编程的高效选择
深入浅出 Go 语言:现代编程的高效选择 引言 Go 语言(也称 Golang)是由 Google 开发的一种现代编程语言,面向高效、简单和并发。自 2009 年问世以来,它已迅速成长为许多企业和开发者首选的语言,尤其是在后端开发、云计算和微服务领域。 本文旨在从 Go 语言的设计哲学、…...
RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)
RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整,全面重新设计业务逻辑代码,代码量减少一半以上,开发更加高效。全系统引入全新字体图标,整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar,让开发更加…...
vue路由的钩子函数?
在 Vue 中,路由的钩子函数可以用来在导航过程中执行一些操作,比如进行权限验证、页面加载前后的处理等。常用的路由钩子函数包括全局前置守卫、全局解析守卫、全局后置钩子以及路由独享守卫。下面是这些路由守卫函数的简要说明: 全局前置守卫…...
【Java】枚举类映射
在数据库中常用数字来代替字符串类型,编写一个枚举映射类 当数据库的介质类型要存储数字,前端可以任意传参,通过枚举转换后端都会转成数字对应类型 import lombok.Getter;/*** <p>* 存档介质类型* </p>** author Jyang* date 2…...
精华帖分享|浅谈金融时间序列分析与股价随机游走
本文来源于量化小论坛公共讨论区板块精华帖,作者为正扬,发布于2024年6月3日。 以下为精华帖正文: 01 引 时间序列分析是个很唬人的术语,实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点,又看到互联…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
