C++相关概念和易错语法(4)(构造函数、析构函数)

一、构造函数

1.实现的功能:实例化对象的时候默认自动调用,相当于初始化。

19093f10ee284c939e94f3204f309529.png

条件:在书写时要满足构造函数的规范(函数名 == 类名,不写返回值,也没有返回值),可以用inline来修饰。

2.自定义构造函数

在自定义构造函数的时候,要清楚默认调用的构造函数是没有传参的,即c1.C(),如果有自定义构造函数,那么下面的这种情况要报错:

1de11d56bd7d453eb99ad3437a8c9728.png

构造函数也支持函数重载,我们可以进一步验证:

8db8d15234fa405288413c28867c15c2.png

这里就能很明显的看到,在默认调用的情况下,只会以c1.C()这种形式去调用(注意:c1.C()这种写法是错误的,这里只是为了形象表示,下同)。

因此,在我们平时自定义构造函数的时候,最好使用全缺省参数,这样的话在我们有特殊初始化需求的时候可以选择自己传参,在其余情况又能默认初始化,这样会很方便。


#include <iostream>
using namespace std;class C
{
public:C(int a, int b, int c){_a = a, _b = b, _c = c;}C(int a = 1){_a = _b = _c = a;}private:int _a;int _b;int _c;
};int main()
{C c1;C c2(4, 5, 6);return 0;
}

注意构造函数是在定义的时候就调用的,格式要严格遵守

40ef5f0f604141bab5abd99028f91e05.png

3.自动生成的构造函数条件

只有在没有自定义构造函数的情况下才会自动生成构造函数。

如果自定义了一个有参数的构造函数,且没有在定义的时候使用,C++也不会自动生成,此时会报错。

1de11d56bd7d453eb99ad3437a8c9728.png

所以要么别自定义构造函数,要么就要定义一个无参或者全缺省的构造函数。如果一定要定义一个有参的构造函数,那么实例化对象时,一定要在定义时调用构造函数,如 C c1(1, 2, 3);

4.自动生成的构造函数的初始化规则

先看一段代码,尝试解释:


class C1
{
public:C1(int a = 1, int b = 1){_a = a, _b = b;}
private:int _a;int _b;
};class C2
{
private:int _x;int _y;C1 _z;
};int main()
{C2 c2;return 0;
}

c2的各个成员变量的初始化值是:

36c6f2d806d74d88bf1977fab223b781.png

我们发现,_x和_y并没有初始化,而_a和_b初始化了,如何解释?

首先需要清楚C/C++内置类型(基本类型)和自定义类型:

内置类型:void、char、short、int、long、float、double、void*、int*等

自定义类型:struct、class、enum等

自动生辰的构造函数初始化成员变量,针对内置类型和自定义类型有不同的初始化方式。

对于内置类型:不进行初始化;

对于自定义类型:调用这些自定义类型的无参(全缺省)构造函数。

对上面的现象分析如下:

d25669fc89ab48b3a48c42396060e5d2.png

尝试解释下面的初始化现象:


class C1
{
public:C1(int a = 1, int b = 1){_a = a, _b = b;}
private:int _a;int _b;
};class C2
{
public:C2(){_x = _y = 2;}
private:int _x;int _y;C1 _z;
};class C3
{
private:int _p;int _q;C2 _r;
};int main()
{C3 c3;return 0;
}

结果是:

cc3798d7ca194084b6ee5b3210a49e66.png

解释:c3没有自定义构造函数,所以自动生成构造函数。_p和_q都是内置类型所以不会初始化,_r是自定义类型,所以调用_r的自定义构造函数。

_r有自定义构造函数,将_x和_y都初始化为2,_z是自定义类型,所以调用_z的自定义构造函数。

_z有自定义构造函数,将_a和_b都初始化为2。

如果成员变量中自定义类型和内置类型同时存在,在少数编译器中,还是会初始化内置类型的。但显然,刚刚演示的编译器就不是这样的。这点也不需要纠结

二、析构函数

实现的功能:在对象生命周期结束后自动free掉堆区开辟的空间,防止内存泄漏。

56e5a4813c2044a981b0ea458fb70897.png

条件:函数名 == ~类名,没有参数,没有返回值,不写返回值。

因为析构函数在对象的生命周期结束后会自动调用,因此它可以很好的解决内存泄漏的问题。

需要注意的是,析构函数不能带有参数,包括全缺省,所以也不需要考虑传参的各种情况。

9fbbf9c2823044fa9c10eb92975dde69.png

 

 

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

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

相关文章

4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令

4.6 offset指令&#xff0c;jmp short指令&#xff0c;far&#xff0c;dword ptr各种跳转指令 可以修改IP&#xff0c;或同时修改CS和IP的指令统称为转移指令。概括的讲&#xff0c;转移指令就是可以控制CPU执行内存中某处代码的指令 1. 转移指令 1.1 8086CPU的转移行为有以…

按照指定的分隔符和次数从右侧开始分割字符串元素numpy.char.rsplit()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 按照指定的分隔符和次数 从右侧开始分割字符串元素 numpy.char.rsplit() [太阳]选择题 请问关于以下代码表述错误的选项是&#xff1f; import numpy as np a np.array([a b c, x,y,z, 1 2,…

HackTheBox-Mist

整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口&#xff0c;将mist.htb加入到hosts文件后&#xff0c;访问mist.htb Pluck CMS文件读取 在…

3.6k star, 免费开源跨平台的数据库管理工具 dbgate

3.6k star, 免费开源跨平台的数据库管理工具 dbgate 分类 开源分享 项目名: dbgate -- 免费开源跨平台的数据库管理工具 Github 开源地址&#xff1a; GitHub - dbgate/dbgate: Database manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under…

Ps:合并到 HDR Pro

Ps菜单&#xff1a;文件/自动/合并到 HDR Pro Automate/Merge to HDR Pro 合并到 HDR Pro Merge to HDR Pro命令可以将同一场景的具有不同曝光度的多个图像合并起来&#xff0c;从而捕获单个 HDR 图像中的全部动态范围。 合并到 HDR Pro 命令分两步进行。 首先&#xff0c;需要…

Day82:服务攻防-开发组件安全Solr搜索Shiro身份Log4j日志本地CVE环境复现

目录 J2EE-组件Solr-本地demo&CVE 命令执行&#xff08;CVE-2019-17558&#xff09; 远程命令执行漏洞(CVE-2019-0193) Apache Solr 文件读取&SSRF (CVE-2021-27905) J2EE-组件Shiro-本地demo&CVE CVE_2016_4437 Shiro-550Shiro-721(RCE) CVE-2020-11989(身…

Emacs之解除comment-region绑定C-c C-c快捷键(一百三十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【资源分享】Eclipse最新版本免费安装下载

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

成为不可替代的人,优秀到不能被忽视

一、资料描述 本套个人成长资料&#xff0c;大小30.89M&#xff0c;共有21个文件。 二、资料目录 00发刊词 成为不可替代的人.pdf 01累死你的不是工作&#xff0c;是错的职场价值观.pdf 02教你选好行业&#xff0c;远离裁员降薪.pdf 03如何选对公司&#xff0c;让高薪升值…

JavaScript中堆栈内存管理机制及其在深拷贝与浅拷贝场景中的应用与解析

一.堆栈的定义 1.栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。 结论&#xff1a;后进先出&#xff08;Last In First Out&#xff09;&#xff0c;简称为LIFO线性表。 栈的应用有&#xff1a;数制转换&#xff0c;语法词法分析&…

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&am…

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…

【Django开发】0到1美多商城项目md教程第5篇:短信验证码,1. 避免频繁发送短信验证码逻辑分析【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

python学习23:python中的列表(list)中的常用方法

列表(list)中的常用方法 1.列表中常用的方法主要有如下的方法&#xff1a; 2.代码演示主要常用的方法 查找某元素在列表内的下标索引&#xff1a;list.index(元素&#xff09; start_list [coco, xuanxuan, taotao] # 1.1 查找某元素在列表内的下标索引 index start_list…

元素定位---自动化测试

元素定位 1. 根据id属性进行定位&#xff08;唯一的id&#xff09; 2. name属性进行定位 3. tag name &#xff08;标签名&#xff09;定位和class name&#xff08;标签中的class属性&#xff09;定位 &#xff08;1&#xff09;使用class name 定位搜狗搜索框 &#xff08;2&…

MySQL-单行函数:数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、MySQL信息函数、其他函数、单行函数练习

1.数值函数 1.1 基本的操作 SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32), FLOOR(-43.23),MOD(12,5),12 MOD 5,12 % 5 FROM DUAL;1.2 取随机数 SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1) FROM DUAL;1.3 四…

Eclipse EMF教程(下)

Eclipse EMF教程&#xff08;下&#xff09; 翻译自&#xff1a;https://eclipsesource.com/blogs/tutorials/emf-tutorial/ 在接下来的部分中&#xff0c;我们将探索我们生成的代码的EMF API。 EMF API 在教程的这一部分&#xff0c;我们将探索EMF的API&#xff0c;包括生成…

C语言基础语法-教案16(从小白到劝退之结构体初阶)

最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 大流量卡 缺点&#xff1a;月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话&#xff0c;而且免费领取。 名额有限&#xff0c;咱们废话不多说直接上…

JS详解-手写Promise!!!

前言&#xff1a; 针对js的深入理解&#xff0c;作者学习并撰写以下文章&#xff0c;由于理解认知有限难免存在偏差&#xff0c;请大家指正&#xff01;所有定义来自mdn。 Promise介绍&#xff1a; 对象表示异步操作最终的完成&#xff08;或失败&#xff09;以及其结果值. 描…

C++:逻辑运算符-非与或(19)

!非!a如果a为假&#xff0c;那么当前他就是真&#xff0c;如果a是真&#xff0c;那么他直接就是假&&与a&&ba与b都为真&#xff0c;那么就是真&#xff0c;如果两个里面有一个为假那么就是假||或a||ba或b有一个为真&#xff0c;那么就是真 非&#xff08;!&…