当前位置: 首页 > 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。进入扩展标签页。点击添加&…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...