类与对象【中】

欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析2

目录
- 👉🏻类的默认6个成员函数
- 👉🏻构造函数
- 内置类型和自定义类型与默认构造函数的关系
- 缺省参数和构造函数的配合
- 👉🏻析构函数
👉🏻类的默认6个成员函数
实际上,我们在声明一个类的时候,编译器会默认生成6个成员函数。
默认成员函数:用户没有显式实现(即自己主动写),编译器会生成的成员函数称为默认成员函数。
👉🏻构造函数
🍳概念
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
🍳特性
构造函数的任务就是用来初始化成员变量
- ⚡️名字和类名相同
- ⚡️无返回值
- ⚡️在实例化对象时自动调用
- ⚡️允许函数重载
class Date{public:Date()//无参构造函数{_year = 1;_month = 1;_day = 1;}Date(int year,int month,int day)//有参构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};int main(){Date d1;Date d2(2023, 8, 5);return 0;}
这里注意,如果是设置无参构造函数,实例化对象,对象不能单单只给一个().
因为编译器不知道你是声明函数还是声明变量。
- ⚡️如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
内置类型和自定义类型与默认构造函数的关系
首先我们先了解下内置类型和自定义类型
内置类型:诸如int、char、double等基本类型,指针全部都是内置类型
自定义类型:class、struct 、union……
默认构造函数:类的对象不需要传参就会自动调用的成员函数。
它们和默认构造函数的关系是什么呢?
默认构造函数对内置类型不进行处理;
默认构造函数会对自定义类型成员调用它的构造函数。
我们举个例子👇🏻👇🏻
class A1{public:A1(){a = 1;cout << a << endl;}int a;};class A2{public:int b;A1 a1;};int main(){A2 var;cout << var.b << endl;return 0;}

我们可以看到,对于内置类型b,默认构造函数对其没有处理,所以最后的结果是随机值。
但是a1是自定义类型,它在被实例化对象为var时,默认构造函数自动启动,去调用它本身的构造函数,所以它被初始化了。
但是到这里,我们就会发现,如果我们自己不显现一个构造函数,那么内置类型的变量岂不是全都是随机值?
所以在c++11中,为了补这个坑,可以允许内置类型成员变量在类中声明时可以给默认值
缺省参数和构造函数的配合
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
class Date{public:Date()//无参构造函数{_year = 1;_month = 1;_day = 1;}Date(int year = 2023,int month = 8 ,int day = 5)//全缺省构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};
上述中,有无参构造函数和全缺省构造函数。
在语法上是没错的,因为构造函数允许重载。
但是在实例化对象时会出错。

因为出现了两个默认构造函数,所以编译器不知道用哪个。
除非这里给了实参,可以让编译器知道用哪个默认构造函数才不会出问题。
🍽如果这里有一个不是全缺省构造函数,则另一个无参构造函数就是唯一的默认构造函数。
class Date{public:Date()//无参构造函数{_year = 1;_month = 1;_day = 1;}Date(int year ,int month = 8 ,int day = 5)//有参构造函数{_year = year;_month = month;_day = day;}void Print(){cout << _year<<"/" << _month<<"/" << _day << endl;}private:int _year;int _month;int _day;};int main(){Date d1;d1.Print();return 0;}

👉🏻析构函数
概念
C++中的析构函数是一种特殊的成员函数,用于在对象被销毁时执行清理操作。析构函数的名称与类名相同,但前面加上一个波浪号(~)。当对象的生命周期结束时(例如,对象超出范围、delete操作符被调用或程序退出),析构函数会自动调用。
析构函数通常是用于释放动态空间上的资源。
特性
- 析构函数名是在类名前加上字符 ~。
- 无参数无返回值类型。
- 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
- 与构造函数类似,对内置类型不处理,但会调用自定义类型成员的默认析构函数
注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数
- 关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数,对自定类型成员调用它的析构函数。
class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}
程序运行结束后输出:~Time()在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数?
因为:main方法中创建了Date对象d,而d中包含4个成员变量,其中_year,_month, _day三个是内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可;
而_t是Time类对象,所以在d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。
但是:main函数 中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函 数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数
目的是在其内部调用Time 类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁
main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生的默认析构函数
🖐所以,如果类中没有申请资源(申请动态空间)时,析构函数可以不写,直接使用编译器生成的默认析构函数
相关文章:
类与对象【中】
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻类的默认6个成员函数👉🏻构造…...
uni-app:实现列表单选功能
效果图: 核心解析: 一、 <view class"item_all" v-for"(item, index) in info" :key"index"><view classposition parameter-info text-over :classitem.checked?"checked_parameter":""…...
vue中axios二次封装并发起网络请求配置
1.安装axios npm i axios 2.导入 //对axios进行二次封装 import axios from "axios"// 创建axios实例,其实request就是axiosconst requests axios.create({// 发请求的时候自动出现api// baseURL:"api",// 请求超时的时间timeout:5000, })…...
开源全文搜索引擎汇总
1、Apache Lucene Java 全文搜索框架 许可证:Apache-2.0 开发语言:Java 官网:https://lucene.apache.org/。Apache Lucene 是完全用 Java 编写的高性能、功能齐全的全文检索引擎架构,提供了完整的查询引擎和索引引擎、部分文本分析引擎。目的是为软件开发人员提供一个简单…...
gitlab CI/CD 安装 gitlab runner
一、为什么需要安装gitlab runner ? 极狐GitLab Runner 极狐GitLab Runner 是在流水线中运行作业的应用,与极狐GitLab CI/CD 配合运作。 说白了就是你部署的一个agent。 二、如何安装? 1.介绍通过helm部署github runner 2.helm添加仓库 h…...
服务器中了malox勒索病毒后怎么办怎么解决,malox勒索病毒解密数据恢复
服务器遭受Malox勒索病毒攻击后,快速解密并恢复数据至关重要,以便减少更大的经济损失。近期,新的一波malox勒索病毒正在肆虐,我们收到很多企业的求助,企业的服务器数据库遭到了malox勒索病毒攻击,导致系统内…...
Python小白学习:超级详细的字典介绍(字典的定义、存储、修改、遍历元素和嵌套)
目录 一、字典简介1.1 创建字典1.2 访问字典中的值1.3 添加键值对1.4 修改字典中的值实例 1.5 删除键值对1.6 由多个类似对象组成的字典1.7 使用get()访问值1.8 练习题 二、遍历字典2.1 遍历所有键值对实例 2.2 遍历字典中的所有键2.3 按照特定顺序遍历字典中的所有键2.4 遍历字…...
word转pdf两种方式(免费+收费)
一、免费方式 优点:1、免费;2、在众多免费中挑选出的转换效果相对较好,并且不用像openOffice那样安装服务 缺点:1、对字体支持没有很好,需要安装字体库或者使用宋体(对宋体支持很好)2、对于使…...
基于图像形态学处理的目标几何形状检测算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................... %二进制化图像 Images_bin imbinari…...
python系列教程211——map
朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow 声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享…...
SW - 3D打印件最好带上浮雕文字标记
文章目录 SW - 3D打印件最好带上浮雕文字标记概述笔记END SW - 3D打印件最好带上浮雕文字标记 概述 做了一些散料飞达的压板, 下了3D打印的单. 一共有10种压板, 每种压板做的数量不等.压板分为2个大的类(中间压板, 边上的压板), 每个类中分了5个子类, 子类之间只是一个高度方…...
Kafka-副本数量设置
1. ISR副本数量设置 指的是存活的副本数量 ISR 机制的另外一个相关参数是 min.insync.replicas , 可以在 broker 或者主题级别进行配置,代表 ISR 列表中至少要有几个可用副本。这里假设设置为 2,那么当可用副本数量小于该值时,就认为整个分…...
解决github打不开的方法
解决github打不开的方法 本文参考文章:解决可ping通但无法访问github网站的问题 一、确定域名github.com的ip地址 进入网址 IP/服务器github.com的信息 - 站长工具 (chinaz.com),查看 ip 地址。 20.205.243.166 github.com二、确定域名github.global.…...
【云原生】Docker中容器管理常用所有命令
1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项:--name:为容器命名 -i:交互式创建容器 -d:后台创建容器 -t:为容器分配伪终端 Docker 容器存在的意义就是为…...
Flutter video_player点击重新播放
视频播放完成之后,暂停视频,点击重新播放 import package:flutter/material.dart; import package:video_player/video_player.dart;class ListViewItemWidget extends StatefulWidget{overrideState createState() {return _ListViewItemWidgetState()…...
CSS3属性之text-overflow:ellipsis
语法: text-overflow:clip | ellipsis 默认值为clip 不显示省略标记 clip:当前对象内文本溢出时不显示省略标记,而是将溢出部分裁剪。 ellipsis:当对象内文本一处时显示省略标记(...)。 一、常见的单行文本溢出显示省略写法: text-overflow: ellipsis; …...
【深度学习_TensorFlow】梯度下降
写在前面 一直不太理解梯度下降算法是什么意思,今天我们就解开它神秘的面纱 写在中间 线性回归方程 如果要求出一条直线,我们只需知道直线上的两个不重合的点,就可以通过解方程组来求出直线 但是,如果我们选取的这两个点不在直…...
C++使用 auto 自动推断类型
C使用 auto 自动推断类型 在有些情况下, 根据赋给变量的初值, 很容易知道其类型。 例如, 如果将变量的初值设置成了 true,就可推断其类型为 bool。如果您使用的编译器支持 C11 和更高版本,可不显式地指定变量的类型&a…...
【前端面试手撕题】call、bind、new、freeze、浅拷贝
FED11 _call函数 描述 请补全JavaScript代码,要求实现Function.call函数的功能且该新函数命名为"_call"。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><style>/* 填写样式 */</style> </head…...
MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评
今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频,现在充电头再以文章的形式呈现给大家,让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
