当前位置: 首页 > 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复…...

R语言_RColorBrewer包--全平台可用

R语言_RColorBrewer包–全平台可用...

VulnHub DC-4

一、信息收集 1.nmap扫描 ┌──(root&#x1f480;kali)-[~/routing] └─# nmap -sS -A 192.168.103.194/24发现开放了22、80端口 ┌──(root&#x1f480;kali)-[~/routing] └─# nmap --scriptvuln -p22,80 192.168.103.194--scriptvuln 是nmap中script模块&#xff0…...

Python 查询 IP 地址段,并获取 Hostname

最近 LinkedIn 爬虫大量抓取网站&#xff0c;需要确定那些是 LinkedIn 的爬虫&#xff0c;经过对 IP 地址反向查询&#xff0c;确定了 hostname。 确定了 IP 地址段之后&#xff0c;我们需要确定每个 IP 的 hostname 是不是&#xff1a;x.fwd.linkedin.com 下面是使用 Python…...

[架构之路-251/创业之路-82]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 商业智能、决策支持系统、知识管理

目录 前言&#xff1a; 一、企业信息化的结果&#xff1a;常见企业信息化软件 1.1 商业智能 - 管理层 1.1.1 什么是商业智能What 1.1.1.1 商业智能常见工具 1.1.2 为什么需要商业智能Why&#xff1f; 1.1.3 谁需要商业智能who&#xff1f; 1.1.4 商业智能在企业管理中的…...

linux shell sh 脚本开机自启动

文章目录 1. 写脚本2. 给权限3. 设自启 1. 写脚本 写一个shell脚本 随便举个例子&#xff0c;每次开机在/home下touch个aa.txt # 创建脚本 touch my_shell.sh# 编写内容&#xff1a; #!/bin/bash touch /home/aa.txt2. 给权限 给编写的脚本执行权限 sudo chmod x my_shell…...

欧科云链研究院:如何降低Web3风险,提升虚拟资产创新的安全合规

在香港Web3.0行业&#xff0c;技术推动了虚拟资产投资市场的快速增长&#xff0c;但另一方面&#xff0c;JPEX诈骗案等行业风险事件也接连发生&#xff0c;为Web3行业发展提供了重要警示。在近期的香港立法会施政报告答问会上&#xff0c;行政长官李家超表示&#xff0c;与诈骗…...

el-table中的el-input标签修改值,但界面未更新,解决方法

el-table中的el-input标签修改值&#xff0c;界面未更新 在el-table中的el-input里面写的change事件根本不触发&#xff0c;都不打印&#xff0c;试了网络上各种方法都没用 然后换成input事件&#xff0c;input事件会触发&#xff0c;但界面也未更新。我在触发事件的时候&…...

Python 中的 Gzip 解压

我们将介绍Python中的gzip解压。 我们还将介绍如何使用 gzip 解压缩来解压缩压缩内容。 Python 中的 Gzip 解压 Python 中构建了许多用于压缩和解压缩目的的库&#xff0c;但我们将介绍 Gzip 库。 它是一种流行的数据压缩工具。 我们可以使用 gzip 通过将数据编码为人类无法读…...

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比&#xff0c;每秒打印1次&#xff0c;总共打印2000次 S0&#xff1a;幸存1区当前使用比例 S1&#xff1a;幸存2区当前使用比例 E&#xff1a;伊甸园区使用比例 O&#xff1a;老年代使用比例 M&#xff1a;元…...

leetcode做题笔记213. 打家劫舍 II

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一…...