【C++】类和对象——构造函数和析构函数

今天要学习两个特殊的函数,分别是构造函数析构函数,它们究竟有什么用呢?
比如说,我们先写一个简单的日期的类

class Date {
public:void Init() {_year = 1;_month = 1;_day = 1;}void Print() {cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main() {Date d1;d1.Init();d1.Print();return 0;
}

我们要定义一个对象后还要对这个对象进行初始化只要定义对象就要初始化,这个步骤是不是有点太繁琐了,甚至我们有时候还会忘记初始化,所以这时,就创造了一种函数叫做构造函数,它其实就是去完成了初始化这个工作,并且它是在对象创建后自动调用的,是不是就让我们省心了不少
它的一些规则是这样的:

1.函数名与类名相同,意思是在日期这个例子中,构造函数的函数名也叫Date
2.无返回值,这里的无返回值意思不是写void,而是根本就不需要写返回值
3.对象实例化(创建对象)时编译器自动调用对应的构造函数
4.构造函数可以重载

比如说我去写一个构造函数

class Date {
public:Date(int year,int month,int day) {_year = year;_month = month;_day = day;}void Print() {cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main() {Date d1(2023,11,22);d1.Print();return 0;
}

这时就可以替换掉Init函数,并且调用的话也是这么去调用,规则的第四条是什么意思呢?构成重载嘛,就是构成重载的函数可以同时存在,比如说

	Date() {_year = 1;_month = 1;_day = 1;}Date(int year,int month,int day) {_year = year;_month = month;_day = day;}

当我去传参调用的话就调用第二个,当我不传参调用就调用第一个,不会产生歧义
在这里插入图片描述
我们又知道有缺省参数这回事,如果我们给第二个构造函数缺省值的话
在这里插入图片描述
那我不传参调那个呢?结果是编译出错,因为调用有歧义
我们已经知道,如果不给构造函数的话,对于日期类(其实也就是内置类型)编译器不会自动去调用构造函数。那如果是自定义类型呢?那编译器就会去调用自定义类型的构造函数,如果自定义类型也没写构造函数,那编译器也无法去调用。
所以在C++11中,内置类型是可以给值的,比如说
在这里插入图片描述
就是在声明的时候后面给上值,这时如果没有构造函数的话,就会用给定的值去初始化,就像这样
在这里插入图片描述
这种情况我们是不是没有写构造函数,可是数据还是初始化了,这时我们就有了一个默认构造的概念,总的来说,我们不去传参数调用的构造函数,都可以叫做默认构造。除了这种情况,还有无参构造函数全缺省构造函数也可以叫默认构造。这三种情况是不能同时存在的
那我们在看看下面这种情况
在这里插入图片描述
构造函数不给缺省值,并且在调用的时候也不给值,这样是会报错的
因为我既然不给d1传值,但是它有构造函数,不传参数就无法调用这个构造函数
有了所谓的初始化函数,那我们是不是也需要一个销毁函数呢?这样就有了我们的析构函数,这里的析构函数其实不是完成对对象本身的销毁,而是完成对象中资源的清理工作(比如说,当一个日期类的对象生命周期结束时,它调用析构函数是没有多大意义的,因为它的年月日随着栈帧的销毁就一并销毁了;但是对于一个栈,它是在堆上申请过空间的,这时把堆上的空间要释放掉是非常有必要的),它的规则如下

1.析构函数名是在类名前加上~
2.无参数,无返回值类型
3.一个类只能有一个析构函数,若未显示定义,系统会自动生成默认的析构函数,并且析构函数不能重载,因为根本就没有参数嘛
4.对象生命周期结束时,会自动调用析构函数

大概就是这样子的
在这里插入图片描述
可以看到,一个对象的创建和生命周期结束确实会自动调用构造函数和析构函数
这里打印的话就是为了表示一下是否调用了该函数和什么时候调用析构函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel 分布式系统

Sentinel 是一种分布式系统的流量防卫兵和熔断器&#xff0c;由阿里巴巴开发并开源。它的主要目标是保护分布式系统中的稳定性和可用性&#xff0c;防止因高并发或异常流量而导致的系统崩溃。下面是 Sentinel 的原理和使用教程的概要&#xff1a; Sentinel 的原理&#xff1a;…

如何去开发一个springboot starter

如何去开发一个springboot starter 我们在平时用 Java 开发的时候&#xff0c;在 pom.xml 文件中引入一个依赖就可以很方便的使用了&#xff0c;但是你们知道这是如何实现的吗。 现在我们就来解决这一个问题&#xff01; 创建 SpringBoot 项目 首先我们要做的就是把你想要给别…

css3

基础 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>style</title><!-- link&#xff08;外部样式&#xff09;和style&#xff08;内部样式&#xff09;优先级相同&#xff0c;重复写会覆盖 --><link re…

面试题-9

1.如何封装一个组件 1.使用Vue.extend()创建一个组件 2.使用Vue.components()方法注册组件 3.如果子组件需要数据,可以在props中接收定义 4.子组件修改好数据,要把数据传递给父组件&#xff0c;可以用emit()方法 原则: 把功能拆开 尽量让组件原子化,一个组件做一件事情 …

centos7安装MySQL—以MySQL5.7.30为例

centos7安装MySQL—以MySQL5.7.30为例 本文以MySQL5.7.30为例。 官网下载 进入MySQL官网&#xff1a;https://www.mysql.com/ 点击DOWNLOADS 点击链接&#xff1b; 点击如上链接&#xff1a; 选择对应版本&#xff1a; 点击下载。 安装 将下载后的安装包上传到/usr/local下…

CTF靶场搭建及Web赛题制作与终端docker环境部署

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 写在前面 ╔═══════════════════════════════════════════════════…

使用ChatGPT创建Makefile构建系统:使用Make运行Docker

使用ChatGPT创建Makefile构建系统&#xff1a;使用Make运行Docker 芯语芯愿&#xff08;知乎/纷传/CSDN/&#xff09;&#xff1b;小石头的芯语芯愿&#xff08;微信公众号&#xff09; 开发高效现代的构建系统对于满足开发周期需求至关重要。原先&#xff0c;嵌入式开发者一…

Unity 场景烘培 ——LensFlare镜头光晕(三)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神指出&#xff01; 文章目录 前言一、镜头光晕 (Lens Flares)是什么&#xff1f;二、使用Lens Flares组件总结 前言 一般情况下都会忽略的东西&#xff0c;镜头光晕。理论上不加镜头光晕&#xff0c;也不会有什么影响…

vue3的两个提示[Vue warn]: 关于组件渲染和函数外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 这个消息是提示我们&#xff0c;需要将引入的方法作为一个变量使用。以vue-store为例&#xff0c;如果我们按照如下的方式使用&#xff1a; import UseUserStore from ../../store/module…

数据治理之考评环节

考评的流程&#xff08;批处理&#xff09; 周期调度&#xff0c;每天一次&#xff1a;采集hive, hdfs元数据存放到mysql中的dga库的metainfo表手动通过管理页面补充辅助信息指标考评 读取要考评的表的元数据及辅助信息读取要考评的指标对每张表的每个指标逐个进行考评保存考评…

RabbitMQ快速入门(简单收发消息)

文章目录 前言一、数据隔离1.用户管理2.virtual host 二、控制台收发1.交换机2.队列3.绑定 三、编程式收发1.依赖和配置2.收发信息 总结 前言 1.了解数据隔离 2.RabbitMQ控制台收发信息 3.SpringBoot整合RabbitMQ收发信息 一、数据隔离 1.用户管理 点击Admin选项卡&#xff0…

mmdet全教程

官方给的文档一言难尽&#xff0c;网上的教程又没有从大纲到源码的完整解读&#xff0c;计划年后开个系列记录一下

依赖库:Ceres-solver-2.0.0安装

依赖库&#xff1a;Ceres-solver-2.0.0安装 前言安装ceres-solver-2.0.0验证 前言 Ceres Solver是谷歌开源的C非线性优化库&#xff0c;能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中&#xff0c;尤其在谷歌开源的cartographer中…

图像分类单张图片预测准确率达到百分之百

在图像分类任务中&#xff0c;针对单个图片得到100%的准确率是有可能但极其罕见的&#xff0c;并且不代表模型在整个测试集上也能达到100%的准确率。   针对单个图片获得100%准确率的情况可能包括以下几种情形&#xff1a; 图片本身特殊性: 如果测试集中的某张图片在训练集中…

【python基础(1)】变量和简单数据类型

文章目录 一. 变量的命名和使用二. 字符串1. 修改字符串的大小写2. 在字符串中使用变量3. 使用制表符或换行符来添加空白4. 删除空白 三. 数1. 整数2. 浮点数3. 整数和浮点数4. 数中的下划线5. 同时给多个变量赋值6. 常量 三. 注释四. Python之禅 一. 变量的命名和使用 变量规…

各种LLM数据集包括SFT数据集

各种LLM数据集包括SFT数据集 数集介绍和 hf上的名字对话数据生成方法交通领域数据集SFT 的解释数集介绍和 hf上的名字 通用预训练数据集 SFT datasets SFT 数据集 50万条中文ChatGPT指令Belle数据集:BelleGroup/train_0.5M_CN 100万条中文ChatGPT指令Belle数据集:BelleGrou…

C++学习 --stack

目录 1&#xff0c; 什么是stack 2&#xff0c; 创建stack 2-1&#xff0c; 标准数据类型 2-2&#xff0c; 自定义数据类型 2-3&#xff0c; 其他创建方式 3&#xff0c; 操作stack 3-1&#xff0c; 赋值 3-2&#xff0c; 插入元素(push) 3-3&#xff0c; 查询元素 3…

Linux的简单使用

Linux命令使用技巧 Tab键自动补全连续两次Tab键&#xff0c;给出操作提示使用上下箭头快速调出曾经使用过的命令使用clear命令或者Ctrll快捷键实现清屏Linux的常用命令 命令作用详细说明ls [-al] [dir]显示指定目录下的内容 -a 显示所有文件及目录 (. 开头的隐藏文件也会列出) …