【C++】3.类和对象(中)

一、类的6个默认成员函数

        在上一篇博客中,我们计算了空类的大小为 1 。那么空类中真的什么东西都没有吗?其实不是的,当一个类在什么都不写的时候就会自动生成6个默认的成员函数(用户没有写,但是编译器自动生成的成员函数)。

接下来我们就将围绕上图展开本篇博客……

二、构造函数——用以对象初始化

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

特征:

        1)函数名与类名相同

        2)无返回值(不需要写void)

        3)实例化对象时由编译器自动调用

        4)可以重载(一般建议写一个全缺省的构造)

        5)若类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数。

但是,一旦用户显示定义了构造函数,编译器就不会自动生成了

        6)内置类型成员变量在类中声明时可以给默认值

        7)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为 是默认构造函数

三、析构函数——用于对象中资源清理

特性:

        1)函数名为在类名前加~

        2)无参无返回值

        3)一个类有且仅有一个析构函数(不支持函数重载),若未显示定义,则由系统自动生成默认的析构函数

        4)对象生命周期结束时,由编译器自动调用析构函数

        5) 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

那么,什么时候需要我们显示定义构造函数,什么时候又不需要我们显示定义析构函数呢?

        需要显示定义情况:有资源需要显示清理时我们需要写析构函数

        不需要显式定义情况:a)没有资源需要清理       

                                            b)内置类型成员没有资源需要清理,剩下的都是自定义类型成员,自定义类型调用自己的析构函数

四、拷贝构造函数——使用同类对象初始化创建对象

        拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。

特征:

        1)拷贝构造函数也是构造函数的重载形式

        2)构造函数的参数有且仅有一个,且必须是类类型对象的引用。传值的话编译器会直接报错。因为会引发无限递归

        引发无限递归的原因分析:在传值调用过程中,需要对形参进行拷贝构造,但是并无拷贝构造函数,会引发无限递归,直到程序崩溃

        3)若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。浅拷贝不能对资源进行管理,如栈中的数组就没法浅拷贝,必须深拷贝才能完成

总结:

        1)如果没有管理资源,一般情况下,不需要写拷贝构造,使用编译器默认生成的即可

        2)如果是自定义类型,内置类型成员没有指向资源,默认生成的浅拷贝构造也可以

        3)一般情况下,不需要写析构函数就不需要写拷贝构造函数

        4)如果内部有指针之类的指向资源,需要显示写析构函数,通常也就需要显示写拷贝构造函数完成深拷贝

五、赋值运算符重载

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

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

相关文章

vue--双向数据绑定原理

Vue采用数据劫持 发布者-订阅者模式实现双向数据绑定,实现逻辑图如下所示: 数据劫持 Vue 借助Object.defineProperty()来劫持各个属性,这样一来属性存取过程都会被监听到 发布者-订阅者模式 主要实现三个对象:Observer&#…

详解IP证书申请

申请IP证书,也被称为IP SSL证书,是一种特殊的SSL证书,它不同于传统的域名验证(DV)证书,是通过验证公网IP地址而不是域名来确保安全连接。这种证书用于保护IP地址,并在安装后起到加密作用。以下是…

Java对接第三方接口C#语言 请求是xml格式方式

文章目录 目录 文章目录 安装流程 小结 概要写法流程技术细节小结 概要 实现方式通过标签方式获取一个Body内标签的信息一步一步解析到需要获取到的数据信息 写法流程 技术细节 先和对面对接项目的开发拿到postman接口数据信息,然后再本地跑通接口,再进…

2024年Instagram运营必备:深入解析Instagram Insights成效分析

Instagram Insights是 Instagram 提供的一项免费数据分析工具,它可以帮助用户更好地了解其粉丝和帖子表现。通过这个工具,用户可以查看有关他们的粉丝、帖子互动和帖子表现的详细数据。更好地洞察目标受众的喜好,从而调整内容和定位策略。 In…

接口自动化测试之调用excel实现接口数据依赖

背景 我们把接口的信息按照规定的格式都维护在excel文件中,通过代码实现调用excel,完成接口的自动化测试。这样,只需要负责人将主要逻辑写好之后,公司其他不会写代码的员工,也可以通过维护excel中的接口数据&#xff…

调度:setTimeout 和 setInterval

有时我们并不想立即执行一个函数,而是等待特定一段时间之后再执行。这就是所谓的“计划调用(scheduling a call)”。 目前有两种方式可以实现: setTimeout 允许我们将函数推迟到一段时间间隔之后再执行。 setInterval 允许我们重…

【优选算法专栏】专题四:前缀和(二)

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中,外观模式是一种常用的结构型设计模式,旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口,这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

网络管理实验二、SNMP服务与常用的网管命令

1 常用的网管命令 1.1 网络状态监视命令 包括以下命令:Ipconfig、ping、nslookup、dig、host ipconfig 作用:用来显示本机所有网卡的基本信息(IP、掩码、网关、工作状态);用法:ipconfig展示:…

分类算法(数据挖掘)

目录 1. 逻辑回归(Logistic Regression) 2. 支持向量机(Support Vector Machine, SVM) 3. 决策树(Decision Tree) 4. 随机森林(Random Forest) 5. K近邻(K-Nearest …

ARM/X86+FPGA轨道交通/工程车辆行业的解决方案

深圳推出首条无人驾驶地铁—深圳地铁20号线,可以说是深圳地铁的一次开创性的突破。智能交通不断突破的背后,需要很严格的硬件软件等控制系 统;地铁无人驾驶意味着信号系统、通信系统、综合监控系统、站台屏蔽门工程等项目必须严格执行验收。…

浦大喜奔APP8.0智能升级,发力数字金融深化五大金融篇章服务

1. 浦大喜奔立足科技赋能持续迭代升级,筑牢用户体验护城河 浦发信用卡中心坚持数字科技与客户体验双轮驱动,以科技赋能发展,优化整体系统性能,全方位支撑浦大喜奔 APP提高线上客户服务能力与体验,积极服务民生消费&a…