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

C++ ——— 类的 6 个默认成员函数之 构造函数

目录

何为默认成员函数

一、构造函数

构造函数的概念

构造函数的特性

日期类的构造函数

栈的构造函数

编译器自动生成的构造函数

总结 


何为默认成员函数

默认成员函数就是用户没有显示实现,但是编译器会自动生成的成员函数称为默认成员函数


一、构造函数

构造函数的概念

构造函数时特殊的成员函数,函数的名字与类名相同,创建类的类型对象时由编译器自动调用

以保证每个数据成员都有一个合适的初始值,并且再对象整个生命周期内只调用一次

构造函数的特性

构造函数虽然名为构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

其特征如下:

1. 构造函数的函数名与类名相同

2. 无返回值(不需要写返回值)

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

4. 构造函数可以重载(我们可以手动写多个构造函数,提供不同的初始化方式)

日期类的构造函数

代码演示:

class Data
{
public:// 无参构造函数Data(){_year = 1;_month = 1;_day = 1;}// 打印void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};

以上代码是一个简单的日期类,其中有一个无参的构造函数,并且给了初始值,那么是否实例化对象后,就能打印出初始化的值呢

代码验证:

可以发现,构造函数,确确实实初始化了成员变量

在特征中说了构造函数可以重载,那么如何传参进行初始化?

代码演示:

// 带参构造函数
Data(int yrar, int month, int day)
{_year = yrar;_month = month;_day = day;
}

在以上的日期类中增加了一个带参数的构造函数

那么该如何传递参数进行初始化呢?

代码验证:

直接在实例化对象的后面初始化即可

合并以上两个构造函数:

// 全缺省构造函数
Data(int yrar = 1, int month = 1, int day = 1)
{_year = yrar;_month = month;_day = day;
}

全缺省的构造函数就可以合并以上两个构造函数,并且初始化时会更灵活

代码验证:

栈的构造函数

代码演示:


class Stack
{
public:// 无参构造函数Stack(){_a = nullptr;_top = _capacity = 0;}// 入栈void Push(int x){// 先判断是否需要扩容if (_top == _capacity){// 扩容int new_capacity = _capacity == 0 ? 4 : _capacity * 2;int* tmp = (int*)realloc(_a, sizeof(int) * new_capacity);// 判断是否扩容成功if (tmp == nullptr){perror("realloc fail");return;}_a = tmp;_capacity = new_capacity;}// 入数据_a[_top++] = x;}// 访问栈顶元素int Top(){assert(_top >= 0);return _a[_top - 1];}// 出栈void Pop(){assert(_top > 0);_top--;}// 判断是否为空bool Empty(){return _top == 0;}// 打印void Print(){while (!Empty()){// 访问栈顶元素cout << Top() << " ";// 弹出栈顶元素Pop();}cout << endl;;}// 释放void Destroy(){free(_a);_a = nullptr;_top = _capacity = 0;}private:int* _a;int _top;int _capacity;
};

以上是一个栈的简单实现,并且封装到类里面

其中有一个无参的构造函数,完成了对栈的初始化

代码验证:

但是这样的无参的构造函数有一个缺点,就是如果最开始就知道要开辟 1000 个空间

那么还是这个无参的构造函数的话,就会导致异地扩容的次数加大,降低效率

所以可以写成全缺省的构造函数

代码演示:

Stack(int n = 4)
{if (n == 0){_a = nullptr;_top = _capacity = 0;}else{_a = (int*)malloc(sizeof(int) * n);_top = 0;_capacity = n;}
}

这个构造函数的意思就是如果实参部分传递了 0 ,那么就初始化为 nullptr

如果实参部分没有传递值,或者传递了其他非 0 的正数值,那么就开辟多少空间

代码验证:

// 不开辟空间
Stack s1(0);// 开辟4个空间
Stack s2;// 开辟100个空间
Stack s3(100);

编译器自动生成的构造函数

在概念中提到过,构造函数是默认成员函数,如果不手动添加,编译器也会自动生成

编译器生成的默认构造函数的特点:

1. 不手动添加构造函数,编译器才会自动生成,手动添加了,编译器就不会生成了

2. 内置类型的成员不会做处理(int、char、int*……这些类型称为内置类型)

3. 对于自定义类型的成员才会处理(结构体、类……这些类型称为自定义类型),会去调用这个自定义类型成员的构造函数

证明第1、2点:

当我把日期类中的构造函数去掉后,如果实例化对象后直接打印,就会出现随机值

这就证明了编译器是自动生成了构造函数的,但只是这个构造函数对内置类型的成员不会做处理

所以打印出来才会是随机值

证明第3点:

代码演示:

class Stack
{
public:// 全缺省构造函数Stack(int n = 4){cout << "Stack(int n = 4)" << endl;if (n == 0){_a = nullptr;_top = _capacity = 0;}else{_a = (int*)malloc(sizeof(int) * n);_top = 0;_capacity = n;}}// ……………………
}class MyQueue
{
private:Stack _PushSt;Stack _PopSt;
};

MyQueue 类中有两个自定义的成员,是两个栈对象的成员,而且我在栈这个类中加上了一句打印,只要实例化一个 MyQueue 类的对象就能证明第 3 点

代码验证:

可以看到,确实调用了栈这个类的构造函数,所以证明了第3点


总结 

一般最好是自己手动写上构造函数

只有在成员是自定义类型的时候可以不用写,因为会去调用这些自定义成员的构造函数,

相关文章:

C++ ——— 类的 6 个默认成员函数之 构造函数

目录 何为默认成员函数 一、构造函数 构造函数的概念 构造函数的特性 日期类的构造函数 栈的构造函数 编译器自动生成的构造函数 总结 何为默认成员函数 默认成员函数就是用户没有显示实现&#xff0c;但是编译器会自动生成的成员函数称为默认成员函数 一、构造函数 …...

win11 恢复任务栏copilot图标, 亲测有效

1、修改C:\Windows\System32\IntegratedServicesRegionPolicySet.json&#xff0c;解除中国不能使用copilot的限制。 使用Notepad搜索copilot全文搜索&#xff0c;将下面两处的“CN,”删除&#xff0c;删除后如下&#xff1a; {"$comment": "Show Copilot on t…...

计算机网络-IPSec VPN工作原理

一、IPSec VPN工作原理 昨天我们大致了解了IPSec是什么&#xff0c;今天来学习下它的工作原理。 IPsec的基本工作流程如下&#xff1a; 通过IKE协商第一阶段协商出IKE SA。 使用IKE SA加密IKE协商第二阶段的报文&#xff0c;即IPsec SA。 使用IPsec SA加密数据。 IPsec基本工作…...

Tomcat项目本地部署

前言&#xff1a; 除了在idea中将项目启动之外&#xff0c;也可以将项目部署在本地tomcat或者云服务器上&#xff0c;本片文章主要介绍了怎样将项目部署在本地tomcat 下面介绍如何使用Tomcat部署本地项目&#xff1a; 1、本篇文章使用的项目案例为一个聚合项目&#xff0c;ha…...

开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置

一、什么是Dbsyncer 1、介绍 Dbsyncer是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景&#xff0c;支持上传插件自定义同步转换业务&#xff0c;提供监控全量和增量数据统计图、应用性能预警…...

虚幻引擎开发命名规则

UE的命名规则如下&#xff1a; 模版类以T作为前缀&#xff0c;例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头&#xff0c;如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀&#xff0c;如bPe…...

解释强化学习中的batch, epoch, episode有什么区别与联系,分别有什么作用

强化学习中的batch, epoch, episode 1.Batch1.1 最后一个batch不足32该怎么处理&#xff1f;1.1.1 方法一&#xff1a;丢弃最后一个不完整的 batch1.1.2 方法二&#xff1a;填充最后一个不完整的 batch1.1.3 选择哪种方法&#xff1f; 2.Epoch3.Episode4.区别与联系4.1 区别4.2…...

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…...

使用docker-compose安装Milvus向量数据库及Attu可视化连接工具

首先确保系统已经安装上了docker 然后去https://github.com/docker/compose/releases/下载安装docker-compose 跟随自己下系统和服务器情况下载 上传到服务器 mv docker-compose-linux-aarch64 docker-compose chmod x docker-compose2.dockr-compose命令 docker-compose …...

PostgreSQL函数中使用now()或current_timestamp的异同

在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间&#xff0c;包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间&#xff0c;但不包括时区信息。它…...

开发类似的同款小程序系统制作流程

很多老板想要开发一款和别人家类似的同款小程序系统&#xff0c;但是不知道该怎么开发制作&#xff0c;本文就为大家详细介绍一下开发类似的同款小程序的流程为大家做参考。 一、前期准备找到对标小程序&#xff1a;首先&#xff0c;需要找到你想要模仿的同款小程序&#xff0…...

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。...

P1784 数独 C语言(普遍超时写法)

题目&#xff1a; https://www.luogu.com.cn/problem/P1784 题目描述 数独是根据 99 盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并满足每一行、每一列、每一个粗线宫内的数字均含 1−9 &#xff0c;不重复。每一道合格的数独谜题都有且仅有唯一答案…...

基于最新的Apache StreamPark搭建指南

一、StreamPark 的介绍 官方文档:Apache StreamPark (incubating) | Apache StreamPark (incubating) 中文文档:Apache StreamPark (incubating) | Apache StreamPark (incubating)Github地址:https://github.com/apache/incubator-streampark Apache StreamPark™ 是一个…...

思科模拟器路由器的基本配置

一、实验目的 了解路由器的作用掌握路由器的基本配置方法 3、掌握路由器模块的使用和互连方式 二、实验环境 2811路由器一台&#xff0c;计算机两台&#xff0c;Console配置线一根&#xff0c;网线若干&#xff1b;本实验拓扑图如图8-1所示&#xff1b;计算机IP地址规划如表8-…...

vue3 computed watch 拓展reduce函数

computed computed 计算属性计算属性 就是当依赖的属性的值发生变化的时候&#xff0c;才会触发他的更改&#xff0c;如果依赖的值&#xff0c;不发生变化的时候&#xff0c;使用的是缓存中的属性值。 import {reactive,ref,computed} from "vue"//price 改变&…...

MyBatis 中 SQL 片段复用

MyBatis 中 SQL 片段复用&#xff1a;提升代码效率与可维护性 在使用 MyBatis 进行数据库操作时&#xff0c;常常会遇到一些 SQL 语句的部分内容重复出现的情况&#xff0c;比如多个查询语句都涉及相同的字段列表。这时&#xff0c;MyBatis 的 SQL 片段复用功能就派上用场了。…...

【实操GPT-SoVits】声音克隆模型图文版教程

项目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目&#xff0c;不阐述技术原理&#xff08;后期如果有时间研究&#…...

用HTML和CSS实现3D圣诞树效果

简介 随着圣诞节的临近&#xff0c;许多开发者喜欢在自己的项目中加入一些节日氛围。今天&#xff0c;我们将学习如何使用HTML和CSS来实现一个简单的3D圣诞树效果。通过这些基本的前端技术&#xff0c;我们可以制作出富有创意的视觉效果&#xff0c;并为网站增添节日气氛。 本…...

Burp入门(10)-IP伪造插件

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;IP伪造和爬虫审计_哔哩哔哩_bilibili 本文详细介绍IP伪造插件Burp Fake IP使用。 一、插件安装 打开Burp Suite。进入扩展标签页。点击添加&…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...