C++ -3- 类和对象 (中) | 构造函数与析构函数(一)

news2024/11/14 10:58:08

文章目录

  • 1.类的6个默认成员函数
  • 2.构造函数
  • 3.析构函数
  • 构造函数与析构函数
    • 应用场景
    • 缺省值初始化

1.类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

有显示实现,就调用显示实现的函数,编译器也不会再生成这个功能的成员函数。

在这里插入图片描述


2.构造函数

构造函数:是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次

需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

  • 函数名和类名相同
  • 无返回值 ⇨ 不是 void ,就是没有
  • 自动调用(对象实例化的时候)
  • 构造函数可以重载 ⇨ 一个类可以有多个构造函数
  • 示例:
class Stack
{
public:
	Stack()
	{
		_a = (int*)malloc(sizeof(int) * 4);
		if (!_a)
		{
			perror("malloc fail");
			exit(-1);
		}
		_size = 0;
		_capacity = 4;
	}
	Stack(int n)//函数重载
	{
		_a = (int*)malloc(sizeof(int) * n);
		if (!_a)
		{
			perror("malloc fail");
			exit(-1);
		}
		_size = 0;
		_capacity = n;
	}


private:
	int* _a;
	int _size;
	int _capacity;
};

int main()
{
	Stack st1;
	Stack st2(6);

	return 0;
}
  • 建构造函数尽量用全缺省函数,全缺省函数和无参数函数不建议同时存在(因为全缺省函数也可以不给参数):
clss Date
{
	Date(){} //无参数函数
	Date(int year=1,int month=1,int day=1){} //全缺省函数
}
  • 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
Stack st();
Stack func();//函数声明

warning:未调用原型函数(是否是有意用变量定义的?)👇

class Stack
{
public:
	Stack()
	{
		_a = (int*)malloc(sizeof(int) * 4);
		if (!_a)
		{
			perror("malloc fail");
			exit(-1);
		}
		_size = 0;
		_capacity = 4;
	}
private:
	int* _a;
	int _size;
	int _capacity;
};

int main()
{
	Stack st1();
	//warning C4930: “Stack st1(void)”: 未调用原型函数(是否是有意用变量定义的?)
	return 0;
}
  • 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数(一旦用户显式定义编译器将不再生成)。
  • vs2022下 编译器默认生成的构造函数的结果👇
    在这里插入图片描述

3.析构函数

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

  • 析构函数名是在类名前加上字符~(在C语言中是:按位取反)
  • 无参数无返回值类型
  • 一个类只能有一个析构函数
  • 对象生命周期结束时,C++编译系统系统自动调用析构函数。
class Stack
{
public:
	Stack(int n = 4)
	{
		_a = (int*)malloc(sizeof(int) * n);
		if (!_a)
		{
			perror("malloc fail");
			exit(-1);
		}
		_size = 0;
		_capacity = n;
	}

	~Stack()
	{
		if (_a)
		{
			free(_a);
			_a = NULL;
			_capacity = 0;
			_size = 0;
		}
	}


private:
	int* _a;
	int _size;
	int _capacity;
};
int main()
{
	Stack st1(6);
	Stack st2;
	
	//对象在销毁时会自动调用析构函数
	return 0;//结束程序
}

对象在销毁时会自动调用析构函数👇
在这里插入图片描述

  • ps. 析构的时候具有和栈一样的特性——后进先出,如上图,变量 st2 先析构,变量 st1 后析构

构造函数与析构函数

在这里插入图片描述
(ps. 内置类型 和自定义类型 是C++中区分出的概念)

  • 默认生成的构造函数/析构函数:

    1. 内置类型成员不处理bug
    2. 自定义类型成员,会去调用它的默认构造函数
  • 默认构造函数:不用传参的构造函数(无参函数或全缺省函数)

应用场景

OJ:【用栈实现队列】题解+代码 | 数据结构:栈和队列 | [C语言]
在【用栈实现队列中】,我们用两个栈(push栈和pop栈)(详情见👆文章)实现了一个队列
对于 pushStackpopStack 我们都需要初始化栈销毁清理栈

  • 对于 C++:自定义类型成员,编译器 自动调用 它的默认构造和析构函数,如下图
    在这里插入图片描述

缺省值初始化

针对以上这个 bug补丁声明位置给缺省值,默认生成的构造函数会用缺省值初始化

class Stack
{
public:

private:
	//声明位置给缺省值
	int* _a = nullptr;
	int _size = 0;
	int _capacity = 0;
};
  • 用缺省值初始化:
    在这里插入图片描述

END

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

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

相关文章

网络安全必学渗透测试流程

这个靶场是一个对渗透新手很友好的靶场。而且,该靶场包含了渗透测试的信息收集,漏洞利用和权限提升的全过程,对新手理解渗透测试的流程有很好的帮助。 靶场地址:https://hackmyvm.eu/machines/machine.php?vmHundred 靶场基本情…

关系数据库(查询优化)

选择操作的实现select * from student where Sno201212128; 简单的全表扫描法优点:对于小表简单有效 缺点:对于大表顺序扫描浪费时间效率低下索引扫描方法 连接操作的实现 连接操作是查询处理中最耗时的操作之一 select *from student,sc where s…

云上数据变革:Databend Cloud 正式发布

2023 年 4 月 20 日,Databend Cloud 经历了近两年的打磨终于发布了!🎉 此次发布会由北京数变科技有限公司【Databend Labs】联合阿里云共同举办。Databend Cloud 借助于云原生数仓 Databend 实现了云简单易用的大数据分析场景。 以下内容来…

Python语言中的注释方法应用

Python语言中的注释方法 在Python编程中,与其他编程语言一样,有良好的注释部分,会让你的程序在后续的改进或优化中,变得便利。同时,给自己培养了良好的编程习惯。 在Python语言中,有两种注释方法。 1.单行…

报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果?

导读 语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。 在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我…

API Testing 一个基于 YAML 文件的开源接口测试工具

API Testing 一个基于 YAML 文件的开源接口测试工具,同时支持运行在本地、服务端。 在选择工具时,可以从很多方面进行考量、对比,以下几点是该工具的特色或者优点: 开源与否,atest 采用 MIT 开源协议,是最流…

传智教育“大同互联网职业技术学院”奠基仪式盛大举行,开拓高等职业教育发展新版图

2023年4月20日,大同市“数字经济职业教育发展论坛暨大同互联网职业技术学院奠基仪式”在大同隆重举行。论坛由中共大同市委、大同市人民政府主办,大同市教育局、传智教育承办,并全程在多平台进行线上直播。 大同市委副书记、市长张强&#x…

学生成绩管理系统winform+SqlServer

主要技术: 基于C#winform架构和sql server数据库 功能模块: 学生选课, 可以查询个学期各科成绩 查看或者选择选课信息 显示当前课表,管理员后台管理 开设课程 课程查询(上课时间和地点) 录入该课程下的…

【Java】jieba结巴分词器自定义分词词典 超详细完整版

发现一款很轻量好用的分词器->结巴分词器 分享给大家 不仅可以对常规语句分词,还可以自定义分词内容,很强大!! 源码地址👉:https://github.com/huaban/jieba-analysis 简单使用 如果是常规的语句&#…

transformer与vit

transformer结构,位置编码复现 https://wandb.ai/authors/One-Shot-3D-Photography/reports/-Transformer—Vmlldzo0MDIwMjc 训练部分 https://nlp.seas.harvard.edu/2018/04/03/attention.html#training transform训练代码从0构建 https://blog.csdn.net/BXD1…

全注解下的SpringIoc 续1

上篇文章介绍了ioc的基本用法和ComponentScan注解的使用,这篇文章我们来看看依赖注入的部分。 提起依赖注入,想必大家肯定会想到Autowired注解,的确,它是我们用的最多的一个。 还记得容器的顶级接口BeanFactory 吗,它定…

微信开发者工具使用git提交项目至gitee远程仓库(保姆级)

1. 开始 1.1. 点击进入gitee官网 进入主页之后,根据图片右上角点击新建仓库 输入自定义仓库名称, 访问路径点击创建仓库 这里不要点击初始化文件, 复制Git远程仓库路径 打开微信开发者工具,新建项目什么的就不多说了,打开项目,根据图片所示, 点击版本管理弹出窗口, 点击远程…

代码生涯冲常见的的bug.例如layui表格中日期自动生成、eacharts 报表的重复点击事件

1、layui表格中日期不受控制的自动生成&#xff0c;这种情况往往是你设置了日期类型的强转 例 对于这种情况你需要定义templet模板 1、 {field: outtime, title: 离开时间,templet : "#time"} 2、 <script type"text/html" id"time"> …

通过Salesforce考试 (考证) 后,如何在Trailhead上验证和维护证书?

随着Salesforce产品家族的不断壮大&#xff0c;学习者可以考的认证也在不断增多。从十几年前的几个认证&#xff0c;增长到现在的40多个认证。 在获得Salesforce认证之后&#xff0c;除了要将其放在LinkedIn和Trailblazer.me个人资料中&#xff0c;还有一种官方途径可以让其他…

野火STM32电机系列(五)Cubemx配置高级定时器TIM1

鸽了一段时间&#xff0c;放心不会断的哈&#xff0c;目前仅仅是显示屏坏了&#xff0c;不影响后面项目 前文已经配置了GPIO、编码器 本节讲解CubeMX高级定时器TIM1配置带死区的6路互补的PWM 同时配置信号触发后续ADC采集 板子引角的原理图如下 对应的&#xff1a; Motor1…

一文告诉你什么是无代码?无代码开发有什么好处

全球知名IT研究机构曾预测&#xff1a;到2025年&#xff0c;企业机构开发的新应用中&#xff0c;有70&#xff05;将会使用无代码技术&#xff0c;并会使用至少四种低代码或无代码开发工具。甚至有人预言&#xff1a;“代码—低代码—无代码”&#xff0c;将是编程历史上的一种…

2022年中国广义数据智能市场规模为442亿元

数据智能是当前市场上的热点应用。但业界对于数据智能的发展状况&#xff0c;缺乏深入探讨与研究。为了系统梳理中国数据智能行业市场全景&#xff0c;厘清行业发展脉络&#xff0c;为从业者提供有价值的借鉴&#xff0c;海比研究院联合中国软件网、中国软件行业协会应用软件产…

Zabbix“专家坐诊”第188期问答汇总

问题一 Q&#xff1a;zabbix能监控waf日志针对告警么&#xff1f; A&#xff1a;可以通过snmp trap的方式。 Q&#xff1a;snmp trap在zabbix端怎么配置呢&#xff1f;我配置的不生效&#xff0c;zabbix服务器端。 A&#xff1a;trap要先在设备开启&#xff0c;设备有告警会…

绒毛/短毛渲染

文章目录 多层毛发模型123 代码实现cgincshader refer&#xff1a; 腾讯游戏学堂 主要来自这里&#xff0c;感谢讲解&#xff01; 首先说一点&#xff0c;很多文章都把毛发和头发弄混&#xff0c;根本就不是一回事好吧&#xff0c;为了区分&#xff0c;我的两篇文章分别用了长…

数值分析(四) Hermite(埃尔米特)插值法及matlab代码

目录 前言一、Hermite插值1. Hermite定理2. 重节点差商3. 重节点Newton插值4. Hermite 插值公式4.1 三点三次 Hermite插值4.2 两点三次 Hermite插值4.3 2 n 1 2n1 2n1次Hermite插值多项式 二、Hermite插值算法及matlab代码1. 2 n 1 2n1 2n1次Hermite插值matlab代码实现2. 例…