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

news2025/1/19 14:32:07

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

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.coloradmin.cn/o/1239103.html

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

相关文章

字符串和内存函数(2)

文章目录 2.13 memcpy2.14 memmove2.15 memcmp2.16 memset 2.13 memcpy void* memcpy(void* destination, const void* source, size_t num); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。如果so…

企业计算机服务器中了locked勒索病毒怎么办,勒索病毒解密恢复

计算机网络为企业的生产生活提供了极大帮助&#xff0c;让企业逐步走向数字化办公&#xff0c;但随之而来的网络安全威胁也不断增多&#xff0c;网络勒索病毒病毒攻击企业计算机的事件频发&#xff0c;并且攻击加密手段也在不断提升。近期&#xff0c;云天数据恢复中心再次接到…

接口测试 —— requests 的基本了解

● requests介绍及安装 ● requests原理及源码介绍 ● 使用requests发送请求 ● 使用requests处理响应 ● get请求参数 ● 发送post请求参数 ● 请求header设置 ● cookie的处理 ● https证书的处理 ● 文件上传、下载 requests介绍 ● requests是python第三方的HTTP…

python -opencv 中值滤波 ,均值滤波,高斯滤波实战

python -opencv 中值滤波 &#xff0c;均值滤波&#xff0c;高斯滤波实战 cv2.blur-均值滤波 cv2.medianBlur-中值滤波 cv2.GaussianBlur-高斯滤波 直接看代码吧&#xff0c;代码很简单&#xff1a; import copy import math import matplotlib.pyplot as plt import matp…

第二十章 多线程

20.2创建线程 20.2.1继承Thread类 Thread类是Java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建议Thread实例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1让线…

论设备管理的发展趋势及对策

作者&#xff1a;韩平 设备是企业生产要素的一个重要组成部分&#xff0c;是企业进行生产活动的物质硬件基础&#xff0c;也是决定企业生产效能的重要因素之一。 设备管理又称设备工程&#xff0c;是根据企业生产经营目标&#xff0c;为了提高设备效能&#xff0c;在调查研究…

主播产品话术

以电子产品为例 一、产品特点 1.高效性能:这款产品采用了最先进的技术&#xff0c;确保高效运行&#xff0c;让你的工作更加流畅。 2.便捷操作:设计简洁&#xff0c;操作方便&#xff0c;即使是不熟悉电子产品的人也能轻松上手。 3.时尚外观:多种颜色可选&#xff0c;满足你…

2023年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 点击绿旗,运行程序后,舞台上的图形是?( ) A:画笔粗细为4的三角形 B:画笔粗细为5的六边形 C:画笔粗细为4的六角形 D:画笔粗细为5的三角形 答案:D 第2题 如下图所示,从所给…

零编程基础Python的全面学习指南

文章目录 前言什么是编程&#xff1f;Python代码对应的机器码准备开始Windows变量类型整型字符串型布尔类型字符串连接和整数相加if 语句捕获用户输入导入MacWindows游戏时间&#xff01;小结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyt…

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段&#xff0c;Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗&#xff1f;希望减少开发和质量检查之间的滞后时间&#xff1f;想要更快地让新开发…

csdn最新最全pytest系列——pytest-xdist插件之多进程运行测试用例|| pytest-parallel插件之多线程运行测试用例

pytest之多进程运行测试用例(pytest-xdist) 前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部…

还不知道指针和引用的区别,一篇文章教会你

1、引用的概念 1.引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名 2.编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 比如:孙悟空&#xff0c;可以叫他孙悟空&#xff0c;也可以叫齐天大圣。本质他们就是一个人 2、引用的定…

CentOS 7 使用Fmt库

安装 fmt Git下载地址&#xff1a;https://github.com/fmtlib/fmt 步骤1&#xff1a;首先&#xff0c;你需要下载fmt的源代码。你可以从https://github.com/fmtlib/fmt或者源代码官方网站下载。并上传至/usr/local/source_code/ ​ 步骤2&#xff1a;下载完成后&#xff…

LINUX入门篇【8】----计算机组成原理以及OS知识的总结

前言&#xff1a; 从而本篇文章开始&#xff0c;我们将进入LINUX的进程篇&#xff0c;但学习进程之前&#xff0c;我们首先需要重新认识我们的计算机&#xff0c;并且正确认识到控制进程的OS&#xff0c;即操作系统是怎样在计算机运行的过程中起到作用的。下面就让我们一同去了…

第二十章:多线程

进程 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth;public class ThreadTest extends Thread {public void run() {for (int i 1; i < 10; i) {//继承重写方法System.out.p…

Thread的常用方法

一&#xff0c;常用方法 二&#xff0c;案例 父类&#xff1a; package ThreadLianXi;import ThreadLianXi.ZhiLeiA;public class Name {public static void main(String[] args)throws Exception{Thread t1 new ZhiLeiA("1号");//修改名字t1.setName("1号&quo…

文件夹批量改名技巧:高效整理文件,随机重命名文件夹

在日常生活中&#xff0c;经常要整理电脑上的文件和文件夹。其中&#xff0c;文件夹的命名是一个重要的环节&#xff0c;因为它可以帮助我们更好地组织和查找文件。有时候我们要对大量的文件夹进行重命名&#xff0c;这时就要使用一些技巧来提高效率。现在一起来看云炫文件管理…

【深度学习】卷积神经网络(CNN)

一、引子————边界检测 我们来看一个最简单的例子&#xff1a;“边界检测&#xff08;edge detection&#xff09;”&#xff0c;假设我们有这样的一张图片&#xff0c;大小88&#xff1a; 图片中的数字代表该位置的像素值&#xff0c;我们知道&#xff0c;像素值越大&#…

【Web】NodeJs相关例题wp

目录 ①[GKCTF 2020]ez三剑客-easynode ②[MoeCTF 2021]fake game ③[安洵杯 2020]Validator ④ [HZNUCTF 2023 final]eznode ⑤[CNSS] &#x1f3ed; EzPollution_pre ⑥[CNSS]✴️ EzPollution ①[GKCTF 2020]ez三剑客-easynode const express require(express); co…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示用户自定义字符应用

基于基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示两行常规字符应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍通过液晶显…