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 引 时间序列分析是个很唬人的术语,实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点,又看到互联…...
任意文件下载漏洞
1.漏洞简介 任意文件下载漏洞是指攻击者能够通过操控请求参数,下载服务器上未经授权的文件。 攻击者可以利用该漏洞访问敏感文件,如配置文件、日志文件等,甚至可以下载包含恶意代码的文件。 这里再导入一个基础: 你要在网站下…...
LeetCode 445.两数相加 II
题目: 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 思路:反转链表 两数相加 I 代码&…...
CentOS 7中查找已安装JDK路径的方法
使用yum安装了jdk8,但是其他中间件需要配置路径的时候,却没办法找到,如何获取jdk路径: 一、确认服务器是否存在jdk java -version 二、查找jdk的 java 命令在哪里 which java 三、找到软链指向的地址 ls -lrt /usr/bin/java l…...
springboot基于Web足球青训俱乐部管理后台系统开发(代码+数据库+LW)
摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…...
RHCE的学习(21)
第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…...
Ubuntu 18.04 配置sources.list源文件(无法安全地用该源进行更新,所以默认禁用该源)
如果你 sudo apt update 时出现诸如 无法安全地用该源进行更新,所以默认禁用该源 的错误,那就换换源吧,链接: https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/ 注意版本: 修改源文件: sudo nano /etc…...
19.UE5道具掉落
2-21 道具掉落,回血、回蓝、升级提升伤害_哔哩哔哩_bilibili 目录 1.道具的创建,道具功能的实现 2.随机掉落 1.道具的创建,道具功能的实现 新建Actor蓝图,并命名为道具总类,添加一个Niagara粒子组件和一个碰撞箱bo…...
MySQL —— MySQL逻辑架构与查询过程
文章目录 MySQL逻辑架构整体分为三层连接层服务层查询缓存解析器优化器执行器 存储引擎层系统文件层 MySQL 查询过程查询过程框图 博客1 博客2 MySQL逻辑架构整体分为三层 最上层为客户端层,并非MySQL所独有,诸如:连接管理、授权认证、权限校…...
ODOO学习笔记(12):自定义模块开发
一、Odoo模块结构基础 基本目录结构 Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹: __init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. impo…...
Excel单元格中自适应填充多图
实例需求:在Excel插入图片时,由于图片尺寸各不相同,如果希望多个图片填充指定单元格,依靠用户手工调整,不仅费时费力,而且很难实现完全填充。如下图中的产品图册,有三个图片,如下图所…...
做建材一般去什么网站宣传/百度预测大数据官网
Q_PROPERTY是一个宏,它可以在Qt的C类中用来声明属性。它的作用是在运行时动态地把一个属性的值与Qt的元对象系统(meta-object system)关联起来,从而使得可以使用Qt的信号和槽机制,以及访问该属性的Qt属性系统来操作这个属性。 举个例子&#…...
django网站开发源代码/亚马逊关键词排名查询工具
文章目录准备工作启用kubesphere应用商店创建一个企业空间、一个项目以及一个用户 (project-regular)kubesphere多租户系统的架构四个系统内置角色创建用户创建企业空间创建项目创建自定义角色和账户上传和提交应用程序发布应用程序发布应用程序至应用商店创建应用分类添加新版…...
wordpress 点赞 开启/营销推广方案怎么写
文章目录Pause容器的作用三个容器的运行总结Pause容器的作用 pause容器,又叫Infra容器,是pod的基础容器,镜像体积只有几百KB左右,配置在kubelet中,主要的功能是使一个pod中多个容器的网络通信 我们看下在node节点上都…...
pdfzz.wordpress.com/cilimao磁力猫最新版地址
laravel-admin的框架已经定义好的多级联动可以去官网查看,这里就不再进行赘述,但是使用中发现功能与想要的东西有些偏差,刚进来默认的时候不好用,就自己改了改,增加了一个默认的方法。以城市和地区的二级联动为例&…...
临沂兰山建设局网站/如何在百度上开店铺
CSS几种定位方式以及定位的叠放次序z-index,绝对定位的盒子居中算法,定位的特殊特性 边偏移 top、left、right、bottom属性可以偏移定位 静态定位「默认」 静态定位是元素的默认定位方式,🈚️定位的意思。 静态定位按照标准流…...
央企 网站建设 公司/seo对网站优化
os.path 参考官方文档 该模块主要针对路径的操作,如果想对文件进行操作,参考 open();如果是针对系统基本的命令,参考 os 模块。 os.path.abspath(‘path’) 返回绝对路径,注意有引号 import os print(os.path.abspat…...