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

C++:构造函数

构造函数是类的六个默认成员函数之一,这里的默认是指我们不写,编译器会自己生成的。

构造函数其目的是初始化对象,不是开空间。

其特征如下:

1.函数名与类名相同

2.没有返回值,意思是不用在函数前面写void。

3.对象实例化时编译器自动调用相应的构造函数

4.构造函数可以重载

5.构造函数位于公共代码区

以下是我们自己写的构造函数:

class date
{
public:date(){_year=1;_month=1;_day=1;}private:int _year;int _month;    int _day;
};

当我们创建一个date对象的时候,会自动调用这个构造函数。

1.默认生成的构造函数

当我们不自己实现任何一个构造函数时,编译器会自己生成一个无参的构造函数,这个函数会把内置类型不会处理(随机值),除非这个内置类型的成员变量是缺省的(cpp11支持声明给缺省值,而自定义类型会调用其无参的构造函数。一般情况下都需要我们自己写构造函数,只有成员变量全是自定义类型时,可以考虑不写(由于自定义类型我们一般是写了构造函数的)。

2.传参数的构造函数:

date(int year,int month,int day)
{_year=year;_month=month;_day=day;
}

我们来运用一下:

int main()
{date d1(2025,5,10)return 0;
}

我们写的date类里面已经有了两个构造函数,当我们实例化类的时候,会根据我们的传参类型自动匹配。

不能这样写:

date d2();

即:没有参数的时候不能加括号,因为编译器分不清这是在定义一个对象还是一个函数的声明(返回值是date的函数声明)。

3.缺省的构造函数:

上面我们实现了一个无参的构造函数,一个带参的构造函数。现在,我们可以通过缺省使这两个函数合并。       

date(int year=1,int month=1,int day=1)
{_year=year;_month=month;_day=day;
}

   这是一个全缺省的构造函数,当我们将类实例化的时候传参或者不传参,调用的都是这个函数,不过需要注意的是,这个函数与无参的构造函数不能同时存在  ,即使语法上这两个函数构成函数重载了,但是实际调用的时候会出现不传参数时不知道调用哪个函数的情况。

合并成全缺省函数之后更灵活了,可以只传一个参数或者两个参数

date d3(2025);
date d4(2025,5);
date d5(2025,5,10);

关于全缺省在我该专栏的另一篇文章有更详细的讲解C++入门-CSDN博客

4.默认构造函数

默认构造函数就是不用传参数就可以调用的,通常有三种:

编译器自动生成的、全缺省的、无参数的。

5.初始化列表

初始化分为两种方式,一种是函数体内初始化,还有一种是初始化列表。

初始化列表是每个成员定义的地方

class date
{
public:date(int year,int month,int day):_year(year),_month(month){_day=day;}
private:int _year;//每个成员声明的地方int _month;int _day;
};

声明不开空间,只有在对象定义的时候才给整体开空间。(开的空间是整的)

由于每个成员是在初始化列表里面定义的,所以在初始化列表里给每个成员开具体的空间。

初始化列表主要作用:
1.const修饰的成员

由于const变量必须在定义的时候初始化,之后就不能在赋值和修改了,所以,const变量在初始化列表里初始化,构造函数体里面的就不是初始化了,是赋值了。

2.引用

引用也必须在定义的时候初始化

3.自定义类型

当成员里含有自定义类型时,而自定义类型又没有默认构造函数,只有带参的构造函数时,只能调用带参的,这个时候我们就可以在初始化列表里面调用(当处于这个类的无参构造时)。

缺省值与初始化列表
class date
{
public:date(int year,int month,int day):_year(year),_month(month){_day=day;}
private:int _year=1;//每个成员声明的地方int _month=1;int _day=1;
};

当我们在成员变量定义的地方给缺省值时,其实这个缺省值是给初始化列表的,如果初始化列表没有显式地给值就用这个缺省值,如果给了,就用显式的那个值。

初始化列表的初始化顺序:

初始化列表的初始化顺序与其声明的顺序相同,因此,我们在显式的给值时,尽量按照声明的顺序。

需要检查操作是否失败的地方还是需要在函数体里面操作。

注意事项:

1.构造函数实际上是需要我们对其做一些检查的,比如传的参数是否符合实际意义。                

相关文章:

C++:构造函数

构造函数是类的六个默认成员函数之一,这里的默认是指我们不写,编译器会自己生成的。 构造函数其目的是初始化对象,不是开空间。 其特征如下: 1.函数名与类名相同 2.没有返回值,意思是不用在函数前面写void。 3.对…...

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

🌹欢迎来到《小5讲堂》🌹 🌹这是《文心智能体》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正&#xff0…...

K8S中构建双架构镜像-从零到成功

背景介绍 公司一个客户的项目使用的全信创的环境,服务器采用arm64的机器,而我们的应用全部是amd64的,于是需要对现在公司流水线进行arm64版本的同步镜像生成。本文介绍从最开始到最终生成双架构的全部过程,以及其中使用的相关配置…...

pth的模型格式怎么变成SafeTensors了?

文章目录 背景传统模型格式的安全隐患效率与资源瓶颈跨框架兼容性限制Hugging Face 的解决方案:SafeTensors行业与社区的推动SafeTensors 的意义总结 背景 最近要找一些适合embedding的模型,在huggingface模型库上看到一些排名比较靠前的,准…...

iOS safari和android chrome开启网页调试与检查器的方法

手机开启远程调试教程(适用于 Chrome / Safari) 前端移动端调试指南|适用 iPhone 和 Android|WebDebugX 出品 本教程将详细介绍如何在 iPhone 和 Android 手机上开启网页检查器,配合 WebDebugX 实现远程调试。教程包含…...

c语言第一个小游戏:贪吃蛇小游戏03

我们为贪吃蛇的节点设置为一个结构体,构成贪吃蛇的身子的话我们使用链表,链表的每一个节点是一个结构体 显示贪吃蛇身子的一个节点 我们这边node就表示一个蛇的身体 就是一小节 输出结果如下 显示贪吃蛇完整身子 效果如下 代码实现 这个hasSnakeNode(…...

​​​​​​​大规模预训练范式(Large-scale Pre-training)

大规模预训练指在巨量无标注数据上,通过自监督学习训练大参数量的基础模型,使其具备通用的表征与推理能力。其重要作用如下: 一 跨任务泛化 单一模型可在微调后处理多种NLP(自然语言处理)、CV(计算机视觉…...

基于Flink的用户画像 OLAP 实时数仓统计分析

1.基于Flink的用户画像 OLAP 实时数仓统计分析 数据源是来自业务系统的T日数据,利用kakfa进行同步 拼接多个事实表形成大宽表,优化多流Join方式,抽取主键和外键形成主外键前置层,抽取外键和其余内容形成融合层,将4次事…...

React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题

React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题 问题背景 在最近的React Native项目开发中,我们的应用在iOS设备上运行良好,但当部署到Android设备时,进入语言设置和隐私设置页面后应用崩溃。我们遇到了…...

iptables实现DDos

最近有客户要定制路由器的默认防火墙等级,然后涉及到了DDos规则,对比客户提供的规则发现我们现有的规则存在明显的错误,在此记录一下如何使用iptables防护DDoS攻击 直接贴一下规则 #开启TCP SYN Cookies 机制 sysctl -w net.ipv4.tcp_synco…...

WPF之高级绑定技术

文章目录 引言多重绑定(MultiBinding)基本概念实现自定义IMultiValueConverterMultiBinding在XAML中的应用示例使用StringFormat简化MultiBinding 优先级绑定(PriorityBinding)基本概念PriorityBinding示例实现PriorityBinding的后…...

调出事件查看器界面的4种方法

方法1. 方法2. 方法3. 方法4....

使用vite重构vue-cli的vue3项目

一、修改依赖 首先修改 package.json,修改启动方式与相应依赖 移除vue-cli并下载vite相关依赖,注意一些peerDependency如fast-glob需要手动下载 # 移除 vue-cli 相关依赖 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…...

Go-GJSON 组件,解锁 JSON 读取新姿势

现在的通义灵码不但全面支持 Qwen3,还支持配置自己的 MCP 工具,还没体验过的小伙伴,马上配置起来啦~ https://click.aliyun.com/m/1000403618/ 在 Go 语言开发领域,json 数据处理是极为常见的任务。Go 标准库提供了 encoding/jso…...

Java详解LeetCode 热题 100(14):LeetCode 56. 合并区间(Merge Intervals)详解

文章目录 1. 题目描述2. 理解题目3. 解法一:排序 + 一次遍历法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景4. 解法二:双指针法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 与解法一的比较5. 解法三:TreeMap法5.1 思路5.2 Java代码实现5.3 …...

将Docker镜像变为可执行文件?体验docker2exe带来的便捷!

在现代软件开发中,容器化技术极大地改变了应用程序部署和管理的方式。Docker,作为领先的容器化平台,已经成为开发者不可或缺的工具。然而,对于不熟悉Docker的用户来说,接触和运行Docker镜像可能会是一个复杂的过程。为了解决这一问题,docker2exe项目应运而生。它提供了一…...

ev_loop_fork函数

libev监视器介绍:libev监视器用法-CSDN博客 libev loop对象介绍:loop对象-CSDN博客 libev ev_loop_fork函数介绍:ev_loop_fork函数-CSDN博客 libev API吐血整理:https://download.csdn.net/download/qq_39466755/90794251?spm1001.2014.3…...

数据治理域——数据治理体系建设

摘要 本文主要介绍了数据治理系统的建设。数据治理对企业至关重要,其动因包括应对数据爆炸增长、提升内部管理效率、支撑复杂业务需求、加强风险防控与合规管理以及实现数字化转型战略。其核心目的是提升数据质量、统一数据标准、优化数据资产管理、支撑业务发展和…...

ES常识7:ES8.X集群允许4个 master 节点吗

在 Elasticsearch(ES)中,4 个 Master 节点的集群可以运行,但存在稳定性风险,且不符合官方推荐的最佳实践。以下从选举机制、故障容错、资源消耗三个维度详细分析: 一、4 个 Master 节点的可行性&#xff1…...

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU:简化的生成式 AI UI界面开源程序,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…...

【第52节】Windows编程必学之从零手写C++调试器下篇(仿ollydbg)

目录 一、引言 二、调试器核心功能设计与实现 三、断点功能 四、高级功能 五、附加功能 六、开发环境与实现概要 七、项目展示及完整代码参考 八、总结 一、引言 在软件开发领域,调试器是开发者不可或缺的工具。它不仅能帮助定位代码中的逻辑错误&#xff0…...

uni-app学习笔记五--vue3插值表达式的使用

vue3快速上手导航&#xff1a;简介 | Vue.js 模板语法 插值表达式 最基本的数据绑定形式是文本插值&#xff0c;它使用的是“Mustache”语法 (即双大括号)&#xff1a; <span>Message: {{ msg }}</span> 双大括号标签会被替换为相应组件实例中 msg 属性的值。同…...

C++类与对象(二):六个默认构造函数(一)

在学C语言时&#xff0c;实现栈和队列时容易忘记初始化和销毁&#xff0c;就会造成内存泄漏。而在C的类中我们忘记写初始化和销毁函数时&#xff0c;编译器会自动生成构造函数和析构函数&#xff0c;对应的初始化和在对象生命周期结束时清理资源。那是什么是默认构造函数呢&…...

OpenCV CUDA 模块中在 GPU 上对图像或矩阵进行 翻转(镜像)操作的一个函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行 翻转&#xff08;镜像&#xff09;操作。它类似…...

基于大模型的原发性醛固酮增多症全流程预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与方法 二、原发性醛固酮增多症概述 2.1 疾病定义与发病机制 2.2 临床表现与诊断标准 2.3 流行病学特征 三、大模型预测原理与技术 3.1 大模型简介 3.2 预测原理与算法 3.3 数据收集与预处理 四…...

从逻辑学视角探索数学在数据科学中的系统应用:一个整合框架

声明&#xff1a;一家之言&#xff0c;看个乐子就行。 图表采用了两个维度组织知识结构&#xff1a; 垂直维度&#xff1a;从上到下展示了知识的抽象到具体的演进过程&#xff0c;分为四个主要层级&#xff1a; 逻辑学基础 - 包括数理逻辑框架和证明理论数学基础结构 - 涵盖…...

Matplotlib 完全指南:从入门到精通

前言 Matplotlib 是 Python 中最基础、最强大的数据可视化库之一。无论你是数据分析师、数据科学家还是研究人员&#xff0c;掌握 Matplotlib 都是必不可少的技能。本文将带你从零开始学习 Matplotlib&#xff0c;帮助你掌握各种图表的绘制方法和高级技巧。 目录 Matplotli…...

如何有效追踪需求的实现情况

有效追踪需求实现情况&#xff0c;需要清晰的需求定义、高效的需求跟踪工具、持续的沟通反馈机制&#xff0c;其中高效的需求跟踪工具尤为关键。 使用需求跟踪工具能确保需求实现进度可视化、提高团队协作效率&#xff0c;并帮助识别和管理潜在风险。例如&#xff0c;使用专业的…...

自动驾驶技术栈——DoIP通信协议

一、DoIP协议简介 DoIP&#xff0c;英文全称是Diagnostic communication over Internet Protocol&#xff0c;是一种基于因特网的诊断通信协议。 DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信&#xff0c;常用于汽车行业的远程诊断、远…...

C++ 与 Go、Rust、C#:基于实践场景的语言特性对比

目录 ​编辑 一、语法特性对比 1.1 变量声明与数据类型 1.2 函数与控制流 1.3 面向对象特性 二、性能表现对比​编辑 2.1 基准测试数据 在计算密集型任务&#xff08;如 10⁷ 次加法运算&#xff09;中&#xff1a; 在内存分配测试&#xff08;10⁵ 次对象创建&#xf…...