【C++类和对象中篇】(构造函数和析构函数)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

 

目录

 🍩1.默认成员函数的概念:

🍩2.构造函数:

2.1特性:

2.2编译器自己生成的构造函数:

🍩3.析构函数:

3.1概念:

3.2特性:


 

 前言:
在类和对象中篇,我们会讲解类的默认成员函数。类的默认成员函数总共有6个,但是最重要4个的是:构造函数,析构函数,拷贝构造函数,赋值运算符重载。本篇我们也是先来讲解前面两个函数:构造函数和析构函数。

 🍩1.默认成员函数的概念:

当我们定义一个类,而没有显式实现,编译器就会按照它自己的规则生成6个默认成员函数。如果显式实现了,那编译器就不会自己生成。

所以就是是一个空类,里面最起码也是有6个默认成员函数的。

//空类

class Data{

};

🍩2.构造函数:

2.1特性:

构造函数是特殊的函数,主要的任务不是开辟空间创建对象,而是初始化对象。

构造函数:

1.函数名和类名相同。

2.没有返回值。(不要写void)

3.实例化对象的时候,编译器自动调用。

4.构造函数可以重载。(无参时,不要写括号)

#include<iostream>
using namespace std;

class Data {
public:
	//没有返回值,名字与类名相同
	//没有返回值也不用写void
	Data() {
		cout << "Data()" << endl;
	}
	Data(int year, int month, int day) {
		cout << "Data(int year, int month, int day)" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data a;
	//Data a();   如果是无参的构造函数,不用写括号,写了()就变成函数声明了
	Data b(2024, 6, 10);
	return 0;
}

但是如果我们没有显式定义构造函数,编译器是会自动生成一个构造函数的。

2.2编译器自己生成的构造函数:

编译器自己生成的构造函数对内置类型(int  char int*)不做处理。其他的类,调用他们的构造函数。

下面的代码就是,我们定义一个Data,里面有其他的类A,那么实例化Data的时候,就回去调用A的构造函数

#include<iostream>
using namespace std;

class A {
public:
	A() {
		cout << "A()" << endl;
	}
};
class Data {

private:
	int _year;
	int _month;
	int _day;
	A a;
};
int main()
{
	Data a;
	return 0;
}

不管是内置类型,还是自定义类型。最终都是落到内置类型这一层面,所以如果成员类也没有写构造函数,那相当于所有的数据都没有进行舒适化。这样看来,好像编译器自己生成的构造函数一无是处。其实并不是这样的,如果我们定义的类里面的成员都是自定义类型,而且这些自定义类型我们都是自己写了显式构造函数的,那么我们就不要写构造函数,用编译器的就行。

#include<iostream>
using namespace std;
class A {
public:
	A() {
		_x = 1;
	}
private:
	int _x;
};
class Data {
private:
	A a;
	A b;
};
int main()
{
	Data a;
	return 0;
}
注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在
类中声明时可以给默认值
#include<iostream>
using namespace std;
class Data {
private:
	int _year = 1900;
	int _month = 1;
	int _day = 1;
};
int main()
{
	Data a;
	return 0;
}

无参的构造函数,全缺省的构造函数,编译器自己生成的构造函数,都是默认构造函数。并且默认构造函数只能有一个,因为有多个,调用的时候就不知道去调用哪一个了。

🍩3.析构函数:

3.1概念:

上面的构造函数不是去创造对象,而是去完成对象的初始化。析构函数也不是去完成对象的销毁,而是去完成资源的清理。

3.2特性:

析构函数也是特殊的成员函数,所以与普通的函数还是有一定的区别的。

1.名称是在类的名称前面加上~。

2.没有返回值,也没有参数。

3.因为没有参数,所以不能去重载。

4.生命结束的时候,会自动调用其析构函数。如果没有显式实现的时候,编译器也是会去生成析构的函数的,默认的析构函数对内置类型不做处理,但是对自定义类型会去调用他们的自己的析构函数。如果有其他的资源,比如动态申请了内存,那么就要自己去写析构函数。

#include<iostream>
using namespace std;
class Time {
public:
	Time() {
		cout << "Time()" << endl;
	}
	~Time() {
		cout << "~Time()" << endl;
	}
};
class Data {
private:
	int _year = 1900;
	int _month = 1;
	int _day = 1;
	Time a;
};
int main()
{
	Data a;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习模型的生命周期与推理系统架构

目录 深度学习模型的生命周期 ​编辑 深度学习模型的生命周期 推理相比训练的新特点与挑战 推理系统架构 推理系统 vs 推理引擎 顶层:API接口和模型转换 中层:运行时(计算引擎) 底层:硬件级优化 边缘设备计算 主要问题 边缘部署和推理方式 方式1:边缘设备计…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

纳什均衡:博弈论中的运作方式、示例以及囚徒困境

文章目录 一、说明二、什么是纳什均衡&#xff1f;2.1 基本概念2.2 关键要点 三、理解纳什均衡四、纳什均衡与主导策略五、纳什均衡的例子六、囚徒困境七、如何原理和应用7.1 博弈论中的纳什均衡是什么&#xff1f;7.2 如何找到纳什均衡&#xff1f;7.3 为什么纳什均衡很重要&a…

Ubuntu 22.04安装cuda及Pytorch教程

文章目录 1、安装显卡驱动2、安装CUDA3、安装cuDNN4、安装pyTorch5、卸载CUDA参考资料 服务器重装系统后&#xff0c;需要重新安装显卡驱动、cuda及Pytorch等&#xff0c;有些步骤容易忘记&#xff0c;这里记录一下。这里我的服务器配置以及安装版本的情况如下&#xff1a; 服…

OpenGauss数据库-5.数据更新

第1关&#xff1a;插入数据 gsql -d postgres -U gaussdb -W "passwd123123" create table student (id integer primary key,name char(20),age integer ); insert into student values(1,"lily",20),(2,lily,21),(3,marry,19); 第2关&#xff1a;删除数…

【只是查漏补缺】关于动力节点2024版java新课程

反编译命令 javap进行反编译操作&#xff0c;例如&#xff1a;javap Test&#xff1b;使用jd-gui.exe来实现反编译。 二进制数据是采用0和1来表示&#xff0c;则换算单位肯定为2的n次方&#xff0c;而2的10次方恰好等于1024&#xff0c;所以就使用了1024来作文文件存储的换算单…

纯理论容器实现的原理

近期在复习容器的原理&#xff0c;希望这篇文章可以帮助到大家。 一、什么是容器&#xff1f; 容器本质上就是主机上的一个进程。这个进程拥有自己的用户空间并且和主机共享内核空间。 容器内的进程可以通过系统调用与内核进行交互&#xff0c;使用内核提供的各种功能和资源。…

数据可视化Python实现超详解【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

【PowerDesigner】创建和管理CDM之新建实体

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. 创建和管理CDM &#x1f30d;​​​​​​2.1 新建CDM &#x1f30d;2.2 新建实体 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1…

Innodb Buffer Pool缓存机制(三)Innodb Buffer Pool内部组成

一、控制块缓存页 Buffer Pool中默认的缓存页大小和在磁盘上默认的页大小是一样的&#xff0c;都是16KB。为了更好的管理这些在Buffer Pool中的缓存页&#xff0c;InnoDB为每一个缓存页都创建了一些所谓的控制信息&#xff0c;这些控制信息包括该页所属的表空间编号、页号、缓存…

11.链表

数组的分类&#xff1a;便于遍历 静态数组&#xff1a;int arr[10]数据过多造成空间溢出&#xff0c;数据过小空间浪费 动态数组&#xff1a;malloc calloc realloc 合理利用空间不能快捷的插入或删除数据&#xff08;会涉及到大量的数据移动&#xff09; 知识点一&#xff1…

【Python】使用pip安装seaborn sns及失败解决方法与sns.load_dataset(“tips“)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

system 和 exec 的区别

在 linux 中&#xff0c;使用 system 和 exec 都可以执行一个程序或者执行一个命令。两者的区别如下&#xff1a; system 中创建了一个子进程&#xff0c;在子进程中执行用户的命令&#xff0c;子进程执行完毕之后&#xff0c;system 会返回。exec 不会创建子进程&#xff0c;…

pdf的压缩该怎么做?快速在线压缩pdf的方法

pdf文件是现在很常用的一种文件格式&#xff0c;有很多的文件内容都可以通过这种格式来展示内容&#xff0c;比如一些通知文件、设计图、个人信息等等&#xff0c;文件的内容越多就会越大&#xff0c;在使用的时候经常会受到一定的限制。那么有什么方法能够快速的将pdf文件变小…

计算机提示msvcp120.dll如何修复,7个不同方法分享

msvcp120.dll 是 Microsoft Visual C Redistributable 的一个关键组件&#xff0c;它包含了 C 运行时库&#xff0c;这些库对基于 Visual C 编写的应用程序至关重要。当应用程序运行时&#xff0c;msvcp120.dll 会被加载到内存中以提供必要的函数和类支持。 一、msvcp120.dll功…

详解python中的pandas.read_csv()函数

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

从GPU到ASIC,博通和Marvell成赢家

ASIC市场上&#xff0c;博通预计今年AI收入将达到110亿美元以上&#xff0c;主要来自与Google和Meta的合作&#xff1b;Marvell预计2028年AI收入将达到70亿至80亿美元&#xff0c;主要来自与Amazon和Google的合作。 随着芯片设计和系统复杂性的增加&#xff0c;科技大厂将更多地…

初阶 《函数》 2.C语言中函数的分类

2.C语言中函数的分类 1.库函数 2.自定义函数 2.1 库函数 为什么会有库函数&#xff1f; 1.我们知道在我们学习C语言编程的时候&#xff0c;总是在一个代码编写完成之后迫不及待的想知道结果&#xff0c;想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能…

排序-快排算法对数组进行排序

目录 一、问题描述 二、解题思路 1.初始化 2.将右侧小于基准元素移到左边 3.将左侧大于基准元素移到右边 4.重复执行上面的操作 5.对分好的左、右分区再次执行分区操作 6.最终排序结果 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 快排算法实现数组排序&am…

配置 JDK 和 Android SDK

目录 一、配置JDK 1. 安装 JDK 2. JDK 环境配置 3. JDK的配置验证 二、配置 adb 和Android SDK环境 1、下载 2、配置 Android SDK 环境 一、配置JDK 1. 安装 JDK 安装链接&#xff1a;Java Downloads | Oracle 我安装的是 .zip &#xff0c;直接在指定的文件夹下解压就…