【C++】类和对象(二) -- 构造函数、析构函数 - 指南

news/2026/1/26 18:02:23/文章来源:https://www.cnblogs.com/gccbuaa/p/19534997

个人主页:小年糕是糕手

个人专栏:《C++》《数据结构(初阶)》《C/C++刷题集》《C语言》

你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!



目录

一、类的默认成员函数

二、构造函数

三、析构函数


一、类的默认成员函数

默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成以下 6 个默认成员函数,需要注意的是这 6 个中最重要的是前 4 个,最后两个取地址重载不重要,我们稍微了解一下即可。

其次就是 C++11 以后还会增加两个默认成员函数,移动构造和移动赋值,这个我们后面博客再讲解。默认成员函数很重要,也比较复杂,我们要从两个方面去学习:

  • 第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。
  • 第二:编译器默认生成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现?

二、构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。

构造函数的特点:

  1. 函数名与类名相同。
  2. 无返回值。(返回值啥都不需要给,也不需要写 void,不要纠结,C++ 规定如此)
  3. 对象实例化时系统会自动调用对应的构造函数。
  4. 构造函数可以重载。
  5. 如果类中没有显式定义构造函数,则 C++ 编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
  6. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造。
  7. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,初始化列表,我们下个章节再细细讲解。

说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型,如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

#include
using namespace std;
class Date
{
public:// 1.⽆参构造函数Date(){_year = 1;_month = 1;_day = 1;}// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}// 3.全缺省构造函数//全缺省可以直接替代无参和带参的构造函数//全缺省和无参不能同时存在,会造成调用歧意/*Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:// 内置类型 -- 会不会初始化是不确定的int _year;int _month;int _day;
};
class Stack
{
public:Stack(){_a = nullptr;_top = 0;_capacity = 0;}
private:int* _a;int _top;int _capacity;
};
//用俩个栈实现一个队列
class MyQueue
{
private:// 自定义类型Stack _pushst;Stack _popst;
};
int main()
{// 如果留下三个构造中的第⼆个带参构造,第⼀个和第三个注释掉// 编译报错:error C2512: “Date”: 没有合适的默认构造函数可⽤Date d1; // 调⽤默认构造函数Date d2(2025, 1, 1); // 调⽤带参的构造函数// 注意:如果通过⽆参构造函数创建对象时,对象后⾯不⽤跟括号,否则编译器⽆法// 区分这⾥是函数声明还是实例化对象// warning C4930: “Date d3(void)”: 未调⽤原型函数(是否是有意⽤变量定义的?)// 这里无参数的函数调用不加括号,否则会报警告,有参数的话要给参数写全不能缺//Date d3();d1.Print();d2.Print();MyQueue q;//MyQueue这个类也没有写构造,编译器会自动生成一个构造//自动生成的构造对于自定义类型会去调用Stack的默认构造,栈刚好有默认构造return 0;
}

三、析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。析构函数的功能类比我们之前Stack实现的Destroy功能,而像Date没有 Destroy,其实就是没有资源需要释放,所以严格说Date是不需要析构函数的。

析构函数的特点:

  1. 析构函数名是在类名前加上字符~。
  2. 无参数无返回值。(这里跟构造类似,也不需要加 void)
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,系统会自动调用析构函数。
  5. 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用他的析构函数。
  6. 还需要注意的是我们显示写析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类型成员无论什么情况都会自动调用析构函数。
  7. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如 Date;如果默认生成的析构就可以用,也就不需要显示写析构,如 MyQueue;但是有资源申请时,一定要自己写析构,否则会造成资源泄漏,如 Stack。
  8. 一个局部域的多个对象,C++ 规定后定义的先析构。
#include
using namespace std;
class Date
{
public:// 1.⽆参构造函数Date(){_year = 1;_month = 1;_day = 1;}// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}// 3.全缺省构造函数//全缺省可以直接替代无参和带参的构造函数//全缺省和无参不能同时存在,会造成调用歧意/*Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:// 内置类型 -- 会不会初始化是不确定的int _year;int _month;int _day;
};
class Stack
{
public:Stack(int n = 4){_a = (int*)malloc(sizeof(int) * n);//..._top = 0;_capacity = 0;}//析构函数~Stack(){if (_a){free(_a);_a = nullptr;_top = 0;_capacity = 0;}}
private:int* _a;int _top;int _capacity;
};
//用俩个栈实现一个队列
class MyQueue
{
private:// 自定义类型Stack _pushst;Stack _popst;
};
int main()
{// 如果留下三个构造中的第⼆个带参构造,第⼀个和第三个注释掉// 编译报错:error C2512: “Date”: 没有合适的默认构造函数可⽤Date d1; // 调⽤默认构造函数Date d2(2025, 1, 1); // 调⽤带参的构造函数// 注意:如果通过⽆参构造函数创建对象时,对象后⾯不⽤跟括号,否则编译器⽆法// 区分这⾥是函数声明还是实例化对象// warning C4930: “Date d3(void)”: 未调⽤原型函数(是否是有意⽤变量定义的?)// 这里无参数的函数调用不加括号,否则会报警告,有参数的话要给参数写全不能缺//Date d3();d1.Print();d2.Print();MyQueue q;//MyQueue这个类也没有写构造,编译器会自动生成一个构造//自动生成的构造对于自定义类型会去调用Stack的默认构造,栈刚好有默认构造//后定义的先析构,先析构s2再析构s1//可以简单的将析构理解为destroyStack s1;Stack s2(10);return 0;
}

对比一下用C++和C实现的Stack解决之前括号匹配问题isValid,我们发现有了构造函数和析构函数确实方便了很多,不会再忘记调用Init和Destory函数了,也方便了不少。

下面举个例子(我们之前刷题时学过的括号匹配问题):

#include
using namespace std;
// ⽤最新加了构造和析构的C++版本Stack实现
bool isValid(const char* s) {Stack st;while (*s){if (*s == '[' || *s == '(' || *s == '{'){st.Push(*s);}else{// 右括号⽐左括号多,数量匹配问题if (st.Empty()){return false;}// 栈⾥⾯取左括号char top = st.Top();st.Pop();// 顺序不匹配if ((*s == ']' && top != '[')|| (*s == '}' && top != '{')|| (*s == ')' && top != '(')){return false;}}++s;}// 栈为空,返回真,说明数量都匹配 左括号多,右括号少匹配问题return st.Empty();
}
// ⽤之前C版本Stack实现
bool isValid(const char* s) {ST st;STInit(&st);while (*s){// 左括号⼊栈if (*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);}else // 右括号取栈顶左括号尝试匹配{if (STEmpty(&st)){STDestroy(&st);return false;}char top = STTop(&st);STPop(&st);// 不匹配if ((top == '(' && *s != ')')|| (top == '{' && *s != '}')|| (top == '[' && *s != ']')){STDestroy(&st);return false;}}++s;}// 栈不为空,说明左括号⽐右括号多,数量不匹配bool ret = STEmpty(&st);STDestroy(&st);return ret;
}
int main()
{cout << isValid("[()][]") << endl;cout << isValid("[(])[]") << endl;return 0;
}

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

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

相关文章

2026吐血整理!高性价比高中辅导机构大揭秘

2026吐血整理!高性价比高中辅导机构大揭秘一、家长的烦恼:补课那些糟心事 新高考改革下,孩子高中学习难度升级,家长为选靠谱又实惠的辅导机构愁眉不展。想找个适配孩子的机构,往往要踩不少坑:师资掺水:宣传页全…

MyCat与MyCat2全面解析:功能、优缺点及实战用法

在分布式数据库架构中&#xff0c;分库分表、读写分离是解决数据量大、并发高的核心方案&#xff0c;而MyCat系列中间件凭借“轻量、易用、兼容性强”的特点&#xff0c;成为国内主流的MySQL分布式解决方案。MyCat作为初代产品已在大量项目中落地&#xff0c;MyCat2作为升级版则…

字典码值映射实战:注解式实现与多方案全对比

在后端开发&#xff08;尤其企业级项目如城市轨道系统&#xff09;中&#xff0c;经常遇到“数据库存码值、前端显名称”的场景。比如你提到的&#xff1a;用01表示“简单”、02表示“普通”&#xff0c;数据库存储degree字段&#xff08;码值&#xff09;&#xff0c;接口返回…

2026国内专业舆情监测报告TOP机构综合评估,五大核心梯队助力企业精准选型

01 行业观察,当前舆情监测行业的标准变迁 舆情监测行业正在经历从“信息雷达”到“数字免疫中枢”的深刻变革。过去,舆情服务更多停留在信息检索和简单分析阶段,而现在已全面升级为融合多模态感知和大模型推理的智能…

考虑晶圆尺寸与负载,如何选择合适的HIWIN晶圆搬运机械手?

在半导体、LED等精密制造领域&#xff0c;晶圆搬运机械手的选型往往直接影响产线效率和产品良率。尤其是当涉及不同尺寸的晶圆和多样的负载需求时&#xff0c;选对机型就像给设备配了“合身的骨骼”&#xff0c;既不能“小马拉大车”&#xff0c;也不能“大材小用”。作为深耕行…

2026外观缺陷检测设备公司技术创新与应用场景解析

外观缺陷检测设备是现代制造业中保障产品质量的关键环节,通过光学成像、智能算法等技术,实现对材料表面缺陷的精准识别与测量,广泛应用于薄膜、金属、玻璃、无纺布等多种物料生产加工场景,助力企业提升生产效率与产…

RAG文件分片上传

文件上传流程 controller层前端会对文件先进行MD5计算出唯一标识,再进行分片向后端发出分片上传的请求 在每个文件第一个分片的时候要进行验证,截取文件的扩展名,验证改文件类型是否支持 如果文件没有所属的组织标签…

2026外观不良检测设备:工业质量控制的关键技术

外观不良检测设备是现代工业生产中保障产品质量的重要工具,通过光学成像、智能算法等技术,可快速识别材料表面的缺陷,如划痕、杂质、色差等,广泛应用于薄膜、金属、玻璃等多种材料的生产环节,助力企业提升生产效率…

2026青砂岩工程板材优质品牌推荐:青砂岩生产厂、青砂岩石材、青砂岩边角料、青砂石材雕刻、佛像石材雕刻厂、内江石材雕刻厂选择指南

2026青砂岩工程板材优质品牌推荐一、行业背景与筛选依据根据搜狐网发布的《中国砂岩行业概览与趋势分析》报告显示,2026年国内砂岩市场规模突破180亿元,年复合增长率保持在6.8%以上。随着建筑装修、景观园林等行业的…

2026年中国舆情监测行业白皮书:附生成式AI舆情监测服务商综合实力排名

站在2026年的开年节点,回望过去一年,中国舆情监测行业已完成了一场从“信息雷达”到“数字免疫中枢”的史诗级进化。随着生成式AI技术在2025年的全面爆发,传统的“人海战术”式舆情监测已彻底成为历史。如今,85%的…

2026年定量泵市场风云变幻,品质、口碑、售后俱佳的品牌会花落谁家?

一、行业发展趋势:技术革新与市场需求双轮驱动1.根据国际流体动力协会(IFPS)发布的《2025全球工业泵市场分析报告》,全球定量泵市场规模预计在2025年达到187亿美元,年复合增长率(CAGR)为5.2%。其中,亚太地区占…

免费领丨2026私域增长sop表格(含引流策略、数据记录)

2026年私域早不是“加好友就变现”的粗放时代啦~现在获客成本越来越高&#xff0c;老板还要看数据&#xff0c;让你算ROI。多少人忙活半天才发现&#xff1a;缺的不是流量&#xff0c;是一套可落地、能复制的标准化打法&#xff01;那今天就给大家准备了一份耗时3个月、拆解近百…

2026外观缺陷自动检测设备技术与应用发展概述

在现代工业生产中,外观缺陷自动检测设备通过光学成像、人工智能算法等技术,对产品表面的瑕疵、划痕、色差等问题进行高效识别与分析,已成为保障产品质量、提升生产效率的关键环节。其广泛应用于薄膜、无纺布、金属、…

揭秘!家长圈口碑爆棚的语文辅导机构大起底

揭秘!家长圈口碑爆棚的语文辅导机构大起底一、语文学习困境引出话题 在孩子的学习生涯中,语文作为一门基础且关键的学科,其重要性不言而喻。然而,不少学生在语文学习的道路上却困难重重。有的孩子一提到写作文就愁…

2026年企业如何进行舆情监测管理?优择新浪舆情通,舆情管理新范式

在2026年的今天,企业面临的舆情环境已发生质变。如果说五年前公关部还在通过关键词匹配来"捞取"负面,那么在AIGC(生成式AI)视频横行、信息裂变以秒计的今天,传统的监测模式已全面失效。一个由AI生成的短…

2026有色金属外观缺陷检测设备技术应用与行业实践

有色金属材料在航空航天、汽车制造、电子设备等高端领域应用广泛,其表面质量直接影响产品性能与安全性。外观缺陷检测作为生产过程中的关键环节,依托自动光学检测技术实现高精度、高效率的缺陷识别,已成为现代工业质…

新浪舆情通:2026企业必备的智能舆情预警系统,高效监测全网风险

2025年中国舆情监测市场规模已突破72亿元,AI驱动型系统占比超过六成。传统模式下,一次舆情事件专报需要分析师花费8小时,而新一代舆情分析智能体只需20分钟。 01 舆情分析新范式 当前舆情生态已经发生深刻变革。数字…

钣金加工品牌大起底:2026年口碑榜上的实力之选,钣金加工推荐排行榜单精选国内优质品牌榜单

在工业制造领域,钣金加工是保障产品品质、实现设备功能的关键环节。从光伏设备到医疗仪器,从自动化机架到通讯机柜,钣金件的精度、外观与交付效率直接影响终端产品的市场竞争力。近年来,武汉市睿意达技术有限公司(…

2026上海语文辅导机构测评推荐:哪些机构口碑性价比均优?

2026上海语文辅导机构测评推荐:哪些机构口碑性价比均优?一、家长的烦恼:如何选语文辅导机构 在上海这座教育资源丰富却也竞争激烈的城市,家长们为孩子的语文学习操碎了心。从孩子牙牙学语时起,对语文启蒙的重视就…

用STM32CubeMX生成一个点灯程序

以前用过STM32CubeMX,但是很久以前的事,现在几乎忘记得一干二净了。 今天,先从官网上下来了一个最新版本的STM32CubeMX。当前最新版本是6.16.1,以前用过的版本是6.8.0的。新版本的STM32CubeMX安装后运行,觉得界面…