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

C++ 初阶 类和对象(中)

前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

目录

一、构造函数

1.1为什么要有构造函数?

1.2构造函数的特性

1.3使用构造函数 

1.4内置类型和自定义类型在构造方面的细节

二、析构函数

1.为什么要有析构函数?

2.析构函数的特性

3.使用析构函数

三、下期预告


一、构造函数

1.1为什么要有构造函数?

在C语言的学习中,我们创建一个结构体变量之后所做的第一件事就是初始化结构体变量,我们往往会为此写上一个初始化函数,Init+被初始化的结构体名字。就拿顺序表来说,我们初始化顺序表就会写上一个InitSeqlist之类的函数。但是我们写了有时也会忘记使用它,哈哈,是不是蚌埠住了,但这就是我们经常会犯的错误,这往往会造成我们的程序与预期不符,举个例子,我们在初始化顺序表的时候应该要将顺序表首元素的指针置空或开空间,但我们若是忘记置空或者忘记开空间,就会导致我们访问到野指针,会造成不可预料的后果。

因此在C++中就诞生了一个超级好用的东西,它就是构造函数,它的作用也是很简单粗暴,那就是在你创建了一个对应的类(结构体)的时候,编译器会根据你书写的构造函数对你创建的类进行初始化。妈妈再也不用当心我忘记初始化类了~

1.2构造函数的特性

1. 无返回值。
2.函数名与类名相同。
3. 对象实例化时编译器自动调用对应的构造函数。
4. 构造函数可以重载。

先来讲一下第一点,无返回值,这里的无返回值是包括void,也就是连void都不用,直接写构造函数名就行了,这时候我们就会接触到第二点,函数名与类名相同,比方说我们要创建一个关于日期的类,我给这个类取名为Date,那么我的构造函数也得写成类。

第三点也就是之前我们强调的一点,这里就不再赘述。第四点则代表了构造函数的可塑性,它是可以重载的,那么也就代表着它能够更加灵活地根据我们的需求去构造。对于重载不是很理解的小伙伴可以去看看博主写的这篇文章。C++初阶 入门(2)-CSDN博客

1.3使用构造函数 

我们拿关于日期的类举例子,年月日基本变量创建一下,再写一个构造函数和打印函数,但需要注意的一点就是构造函数的创建必须要有默认构造函数,否则在你不传变量的时候,编译器没法对其进行简单地初始化,编译器就会报下图所示错误。

什么是默认构造函数?在我看来一共有三种

1.在构造函数中写入缺省值,实现全缺省,这样就可以实现创建无参数变量依然可以初始化变量

2.使用重载的方式来缺省 

 3.在声明的同时进行初始化 

值得一提的是,如果你已经写了构造函数,那么编译器就不会采用你写的声明,而是会去直接调用你写的构造函数,假设你这个构造函数没写完,那就会报错。如图:

屏蔽掉之后就可以正常的使用声明

总结一下:

总的来说,默认构造函数就是指不传参也可以调用的函数,如全缺省。

博主推荐使用方法1来进行构造函数的书写,方法2和方法3写的默认构造函数不是很规矩。

细节:

方法1和方法2不可以同时存在,否则编译器会出现歧义   值得一提的是,方法1和方法2都可以和声明的形式共存,这是因为一旦有了构造函数,编译器就会忽略声明的初始化而去调用构造函数的内容。

1.4内置类型和自定义类型在构造方面的细节

先来说一下什么是内置类型,内置类型就是指语言自带的类型,如int,double,float......自定义类型就很好理解了,就是用户自己定义的类型,如class出来的类。但必须要注意的一点则是,在C++中,编译器会对自定义类型调用它的默认构造函数,而不对内置类型进行处理。

#include<iostream>
#include<stdlib.h>
using namespace std;
class Stack
{
public:Stack(int capacity=10){_capacity = capacity;_top = 0;_s = (int*)malloc(sizeof(int)*_capacity);}
private:int _top;//栈顶元素的位置int _capacity;//容量int* _s;//栈
};
class test
{
public:
private:Stack s1;Stack s2;int a;
};
int main()
{test t1;
}

可以看的出来,test我并没有创建属于它的析构函数,但它自己就去调用了它的自定义类型成员的默认构造函数,使得对应的数据被初始化。有细心的同学可以发现,a也被初始化了,它不应该是随机值吗?我没对它处理啊,是的,它就应该是随机值,但是博主使用的是vs2019这个编译器进行代码的编写,它过于先进了,直接就帮博主优化了,因此看不出现象,而在vs2013写这串代码,这个变量就应该是随机值。感兴趣的小伙伴可以试一下。

二、析构函数

1.为什么要有析构函数?

讲完了构造函数,那么我们就来讲一下析构函数,既然构造函数是令类创建的时候初始化,那么析构函数则是在类的生命域结束的时候将目标清理,也就是destroy,比方说,我们写了一个顺序表,它malloc了一大块空间,那么我们在程序结束之前就应该将这一大块malloc的空间释放掉,避免造成内存泄漏,因此我们需要destroy函数来对一些类进行处理。但还是那句话,写了但忘记用,是常有的事情。因此在C++中,就诞生了一个函数,它就是析构函数,它能够令对应的类出了它的生命域便销毁,从而保证了安全性。

2.析构函数的特性

1. 析构函数名是在类名前加上字符 ~。
2. 无参数无返回值类型。
3. 一若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

先来说下第一点,第一点很好理解,就是在类之前在个波浪号~,第二点和构造函数差不多,但更严格,它连参数都不能有,第三点则表示一个类只能有一个析构函数

3.使用析构函数

拿栈来举例

#include<iostream>
#include<stdlib.h>
using namespace std;
class Stack
{
public:Stack(int capacity=10){_capacity = capacity;_top = 0;_s = (int*)malloc(sizeof(int) * _capacity);}~Stack(){free(_s);_s = nullptr;_top = 0;_capacity = 0;cout << "以下为调用析构函数结果" << endl;cout << _s << endl;cout << _capacity << endl;cout << _top << endl;}void print(){cout << _s <<endl;cout << _capacity << endl;cout << _top << endl;}
private:int* _s;int _capacity;int _top;
};
int main()
{Stack s1;s1.print();
}

三、下期预告

下回我们来聊一下拷贝构造函数,运算符重载QAQ 

好了,今天的分享到这里就结束了,感谢各位友友的来访和阅读,祝各位友友们前程似锦O(∩_∩)O 


 

相关文章:

C++ 初阶 类和对象(中)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、构造函数 1.1为什么要有构造函数&…...

【漏洞复现】Metinfo5.0.4任意文件包含漏洞复现

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1、蚁剑直接连接图片马2、读取敏感目录3、读取php源码4、执行PHP命令5、包含木马写Shell &#xff08;图片马制作新方法&#xff09; 以 metinfo_5.0.4为例 该环境的文件上传…...

【计算机网络实验/wireshark】tcp建立和释放

wireshark开始捕获后&#xff0c;浏览器打开xg.swjtu.edu.cn&#xff0c;网页传输完成后&#xff0c;关闭浏览器&#xff0c;然后停止报文捕获。 若捕获不到dns报文&#xff0c;先运行ipconfig/flushdns命令清空dns缓存 DNS报文 设置了筛选条件&#xff1a;dns 查询报文目的…...

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处&#xff0c;都有一根共地线和两根数据线。但是传递外部信息&#xff0c;串口有两根数据线可以进行双向通信&#xff0c;也就是全双工通信。而在IIC通信下&#xff0c;其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…...

【开题报告】基于 Spring Boot 的在线预约导游系统的设计与实现

1.引言 在旅游行业中&#xff0c;导游起到了重要的作用&#xff0c;他们为游客提供了专业的旅游服务和相关信息。然而&#xff0c;传统的导游预约方式可能存在一些问题&#xff0c;如信息不透明、预约流程繁琐等。因此&#xff0c;我们计划开发一个基于 Spring Boot 的在线预约…...

如何使用ps制作ico图标文件

如何使用ps制作ico图标文件 Chapter1 如何使用ps制作ico图标文件Chapter2 ICOFormat.8bi&#xff08;Photoshop Ico、Cur插件&#xff09;的下载使用1. ICOFormat.8bi的作用2. ICOFormat.8bi使用 Chapter3 ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程步骤 01 制…...

【Linux】logrotate实现“日志文件定时分割“

问题背景 项目部署的过程中&#xff0c;经常会需要查看程序的执行日志。我之前的做法都是用nohup ... > xxx.log 2>&1 &将日志保存到xxx.log文件中的。但是问题是&#xff0c;程序有时会运行很长时间&#xff0c;一直保存在一个文件里&#xff0c;文件会越来越大…...

Android可绘制资源概览(背景、图形等)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、drawable 分类3.1 Bitmap fileXML …...

力扣2095.删除链表的中间节点(java快慢指针)

Problem: 2095. 删除链表的中间节点 文章目录 思路解题方法复杂度Code 思路 利用快慢指针&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff08;循环退出条件是fast指针不为空同时fast.next不为空&#xff09;&#xff0c;但是我们容易发现这样到最后slow指针…...

【Vue-Element-Admin】table添加自定义索引

通过给 typeindex 的列传入 index 属性&#xff0c;可以自定义索引。该属性传入数字时&#xff0c;将作为索引的起始值。也可以传入一个方法&#xff0c;它提供当前行的行号&#xff08;从 0 开始&#xff09;作为参数&#xff0c;返回值将作为索引展示。 <el-table:data&q…...

0008Java安卓程序设计-ssm基于Android平台的健康管理系统

文章目录 **摘要**目录系统实现开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,…...

Mac 禁用一些高占用cup的进程

什么是CrashReporter&#xff1f; CrashReporter在应用程序崩溃的任何时候都会运行&#xff0c;它旨在保存应用程序状态&#xff0c;以帮助开发人员找出应用程序崩溃原因。基本上&#xff0c;一个进程是启动、崩溃&#xff08;并调用CrashReporter&#xff09;&#xff0c;然后…...

layui form表单 调整 label 宽度

这个可以调整所有label .layui-form-label {width: 120px !important; } .layui-input-block {margin-left: 150px !important; }情况是这样的&#xff0c;表单里有多个输入框&#xff0c;只有个别label 是长的&#xff0c;我就想调整一下个别长的&#xff0c;其它不变 <di…...

轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/PrimitiveEntityTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔…...

[ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决

业务需求&#xff1a;需要做到table表格中某些行数据不能被选中&#xff0c;比如在审核一些记录数据时&#xff0c;已经被审核的数据就不能再次提交审核&#xff0c;特别是批量多选的情况&#xff0c;列表中既有已经审核的&#xff0c;也有未审核的&#xff0c;只要求选中未审核…...

【PY】倒计时日历

大家有时候会不会觉得时间记不住呢&#xff1f;PY倒计时日历可以满足你。 main.py&#xff1a; from tkinter import Tk,Canvas from datetime import date,datetime def get_events():list_events[]with open(events.txt)as file:for line in file:lineline.rstrip(\n)curre…...

windows mysql安装

1、首先去官网下载mysql安装包&#xff0c;官网地址&#xff1a;MySQL :: Download MySQL Community Server 2&#xff1a;把安装包放到你安装mysql的地方&#xff0c;然后进行解压缩&#xff0c;注意&#xff0c;解压后的mysql没有配置文件&#xff0c;我们需要创建配置文件 配…...

【蓝桥杯省赛真题42】Scratch舞台特效 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch舞台特效 一、题目要求 编程实现 二、案例分析 1、角色分析...

Kafka(二)消息系统设计

文章目录 前言整体设计时序图时序图解释 最后 前言 当多个系统之间通过Kafka来解耦时&#xff0c;在系统设计初期&#xff0c;基本的要求都是相似的&#xff0c;只不过是消费消息时的业务逻辑可能不同。 本文以业务系统和邮件系统解耦作为示例。业务系统需要发送邮件时&#…...

【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG(目前没有完全的解决方案)

【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG&#xff08;目前没有完全的解决方案&#xff09; GNSS配置如下&#xff1a; 【移远QuecPython】EC800M物联网开发板的内置GNSS定位获取&#xff08;北斗、GPS和GNSS&#xff09; 测试视频&#xff08;包括BUG复…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

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

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

均衡后的SNRSINR

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

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...