类和对象中(1)

news2024/11/15 14:08:30

文章目录

  • 一、类的6个默认成员函数
  • 二、构造函数
    • 1、概念
    • 2、构造函数只初始化自定义类型
    • 3、对于不会初始化内置类型的补丁
    • 4、构造函数优点
  • 三、析构函数
    • 1、概念
    • 2、什么时候需要自己写析构函数 ?
    • 3、构造和析构顺序差异
  • 四、拷贝构造函数
    • 1、概念
    • 2、拷贝构造下传值会无限递归
    • 3、什么时候需要自己写拷贝构造函数 ?
    • 4、拷贝构造优点

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

  如果一个类中什么成员都没有,简称为空类。空类中并不是什么都没有,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

默认成员函数:
用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

二、构造函数

1、概念

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

构造函数特性:
1.函数名与类名相同
2.无返回值
3.对象实例化时编译器自动调用对应的构造函数
4.构造函数可以重载

2、构造函数只初始化自定义类型

  C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char……,自定义类型就是我们使用class/struct/union等自己定义的类型,就会发现编译器生成默认的构造函数会对自定类型成员调用的它的默认成员函数。注意:有些编译器会对自定义类型进行处理,仅仅为个性化行为,在这里我们默认当作编译器不会处理

  当我们写的默认构造函数重载时,如果一个无参,一个带参给了缺省值,就会出问题.同时,只要你手写了默认构造,就不会调用编译器生成的默认构造函数

3、对于不会初始化内置类型的补丁

C++11中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时,可以给默认值,当自己没有写默认构造函数的时候,就用缺省值

小结:
1、一般情况下,有内置类型成员,需要自己写构造函数
2、若成员全是自定义类型,可以让编译器自己生成构造函数

4、构造函数优点

优点:
1、构造函数可以确保对象在创建时被正确初始化。对象的创建时机就是在调用构造函数的时候,因此调用构造函数可以保证对象的正确性。
2、构造函数提供了一种方便的方式来初始化对象的成员变量。
3、构造函数还可以在对象被创建时执行初始化操作,例如为对象分配内存等。
4、如果类中有多个构造函数,可以通过不同的构造函数来初始化对象不同的成员变量。这样可以提供更多的灵活性和选择性,在满足不同需求的情况下方便地创建对象

三、析构函数

1、概念

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

析构函数特征:
1.析构函数名是在类名前加上字符~
2.无参数无返回值类型
3.一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
4.对象生命周期结束时,C++编译系统系统自动调用析构函数

2、什么时候需要自己写析构函数 ?

  对于内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可。如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数。有资源申请时,一定要自己手写,否则会造成资源泄漏,比如Stack类、Queue类

3、构造和析构顺序差异

  .构造顺序是按照语句的顺序进行构造,对象析构要在生存作用域结束的时候才进行析构,即对象析构顺序和栈类似,后面构造的对象反而先析构

下面给一个例题便于大家理解:

小结:

析构函数是一个特殊的成员函数,它负责对象被销毁时释放它所占用的内存。当一个对象的生命周期结束时,系统会自动调用它的析构函数,从而避免内存泄漏等问题,这样就不用手动管理内存,减少了代码的复杂度和出错的可能性。

四、拷贝构造函数

1、概念

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

2、拷贝构造下传值会无限递归

  C++规定,内置类型直接拷贝,自定义类型需要调用它的拷贝构造完成拷贝

特征:
1、拷贝构造函数是构造函数的一个重载形式
2.拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用

  递归如下,先调用 d 1 d_1 d1的拷贝构造来初始化形参date,变成了Date date( d 1 d_1 d1),仔细一看,和原来调用的Date d 2 ( d 1 ) d_2(d_1) d2(d1)形式一模一样,接下来又会调用 d 1 d_1 d1的拷贝构造来初始形参date,依次死循环下去。对此,我们形参必须用引用接收

3、什么时候需要自己写拷贝构造函数 ?

  与构造函数不同,若未显式定义,编译器会生成默认的拷贝构造函数。这里编译器也会拷贝内置类型,,默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝

  既然编译器默认生成的和我们自己实现的拷贝构造函数都能完成拷贝功能,那是不是就不需要我们手动实现了呢?
  类中如果没有涉及资源申请时,拷贝构造函数写不写都可以,一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝,会造成内存泄漏


浅拷贝问题:
1、析构两次,报错
2、一个修改会影响另─个
对此我们要自己完成深拷贝

深拷贝引用场景:
1、使用已存在对象创建新对象
2、函数参数类型为类类型对象
3、函数返回值类型为类类型对象

4、拷贝构造优点

  C++拷贝构造函数是一种特殊的构造函数,用于创建新对象时,将现有对象的值复制到新对象中。

优点:
1、方便复制对象:使用拷贝构造函数可以方便地将一个对象复制到另一个对象。
2、可以避免浅拷贝带来的问题:拷贝构造函数可以确保在进行对象复制时,不会发生深浅拷贝带来的问题,而是通过实现深拷贝,从而避免这类问题的出现。
3、传递对象时更安全:对于传递对象的情况,使用拷贝构造函数可以确保目标对象拥有正确的值,在不确定操作的时候可以避免因为对象值的不确定性出现的错误。
4、可以在对象中实现资源管理:有时候对象中包含有资源(如内存、文件句柄等),拷贝构造函数可以确保正确复制资源。

总结:
  下一篇博客,我们将学习赋值运算符重载,并模拟实现一个日期类,期待我们下一篇博客见面就!!!

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

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

相关文章

MySQL环境搭建——“MySQL数据库”

各位CSDN的uu们你们好呀,小雅兰又来啦,好久没有更文啦,今天继续!!!今天小雅兰的内容是MySQL环境搭建,下面,让我们进入MySQL数据库的世界吧 MySQL的卸载 MySQL的下载、安装、配置 M…

ubuntu18.04下pass-through直通realteck PCI设备到qemu-kvm虚拟机实践

设备直通是一种虚拟化资源分配方式,通过将物理设备直通给虚拟机环境,达到虚拟机可以直接访问物理设备的目的,直通功能对设备的要求不高,不需要设备支持PF/VF,18年后的普通家用PC的PCI设备都支持设备直通模式&#xff0…

【Java】Java对象的比较

Java对象的比较 PriorityQueue中插入对象元素的比较基本数据类型的比较对象的比较重写基类的equals方法基于Comparble接口类的比较基于比较器进行比较 PriorityQueue中插入对象 优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较…

Redis持久化之AOF日志高频问题

1、如何采用AOF日志避免宕机丢失数据? Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。 MySQL数据库的写前日志(Write Ahead Log, WAL),在实际写数据前,…

PWLCM分段线性混沌映射

混沌映射是生成混沌序列的一种方法,常见的混沌映射方式有 Logistic映射、Tent映射、Lorenz映射,而PWLCM(Piecewise Linear Chaotic Map,分段线性混沌映射)作为混沌映射的典型代表,数学形式简单,具有遍历性和随机性。其…

智能优化算法:基于减法平均的优化算法-附代码

智能优化算法:基于减法平均的优化算法 文章目录 智能优化算法:基于减法平均的优化算法1.基于减法平均优化算法1.1 初始化1.2 SABO的数学建模 2.实验结果3.参考文献4.Matlab 摘要:基于减法平均的优化算法(Subtraction-Average-Base…

[数据结构] 二叉搜索树的详解实现

文章目录 概念实现架构BSTreeNodea(节点)BSTree框架 增删查 -- 循环写法insert(尾插)inOrder(遍历)Find(查找)Erase(删除)默认成员函数构造拷贝构造析构函数赋…

哈夫曼编码文件压缩和解压

哈夫曼编码&文件压缩和解压 文章目录 哈夫曼编码&文件压缩和解压哈夫曼编码基本介绍原理解析代码实现 文件的压缩文件的解压完整代码 哈夫曼编码 基本介绍 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于…

实现c++轻量级别websocket协议客户端

1 websocket 轻量客户端 因以前发过这个代码,但是一直没有整理,这次整理了一下,持续修改,主要是要使用在arm的linux上,发送接收的数据压缩成图片发送出去。 要达到轻量websocket 使用,必须要达到几个方面…

MySQL:数学函数和字符串函数

目录 前言: 数学函数: 求绝对值: 求PI: 求平方根: 求余数: 取整: 随机数: 四舍五入: 只舍不入: 返回参数符号: 幂运算: …

Illustrator如何编辑图形对象之实例演示?

文章目录 0.引言1.绘制海浪插画2.绘制时尚波浪发型3.绘制一条鲸鱼 0.引言 因科研等多场景需要进行绘图处理,笔者对Illustrator进行了学习,本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结,本文对图形…

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM 本项目采用HuggingFace提供的工具实现BERT模型案例,并在BERT后接CNN、LSTM等 HuggingFace官网 一、实现BERT(后接线性层) 1.引用案例源码: from transformers impo…

开关电源基础01:电源变换器基础(2)

说在开头:关于德布罗意的电子波(3) 1923年,德布罗意在求出他的相波之前,康普顿刚好用光子说解释了康普顿效应(记性好的胖友们应该还记得:散射波的波长变长问题),从而带领…

开关电源基础02:基本开关电源拓扑(2)-BOOST-BUCKBOOST拓扑

说在开头:关于海森堡的矩阵(2) 海森堡写完论文就回到了哥廷根大学,他一看见玻恩就把这份论文拿出来请老师把关,还说要趁着假期去趟英国剑桥大学讲课交流。玻恩拿过论文一看,海森堡画的这个表格是啥玩意啊&…

【操作系统】高性能网络模式:Reactor 和 Proactor

【操作系统】高性能网络模式:Reactor 和 Proactor 参考资料: 高性能 RPC 通信的实现- 巧用 reactor 模式 高性能网络模式:Reactor 和 Proactor NIO Reactor模型 Netty「基石」之Reactor模式 高性能IO模型分析-Reactor模式和Proactor模式 【…

【服务器】无公网IP,异地远程连接威联通NAS

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 前言 1. 威联通安装cpolar内网穿透 2. 内网穿透 2.1 创建隧道 2.2 测试公网远程访问 3. 配置固定二级子域名 3.1 保留二级子域名 3.2 配置二级子域名 4. 使用固定二级子…

Linux诊断原因:生产环境服务器变慢,诊断思路和性能评估

Linux诊断原因,生产环境服务器变慢,诊断思路和性能评估 1 整机:top,查看整机系统性能 使用top命令的话,重点关注的是 %CPU、%MEM 、load average 三个指标 load average三个指标:分别代表1、5、15时分钟系…

2022年NOC大赛编程马拉松赛道初赛图形化低年级A卷-正式卷,包含答案

目录 选择题: 下载文档打印做题: 2022年NOC大赛编程马拉松赛道【初赛】图形化低年级A卷-正式卷 2022NOC-图形化初赛低年级A卷正式卷 选择题: 1、答案:B 禾木是一个军事迷,他打算利用业余时间制作一款射击游戏。在游戏中,玩家可以通过鼠标控制手枪移动。请问,给手枪…

springboot+vue体质测试数据分析及可视化设计(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体质测试数据分析及可视化设计。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者&a…

[svg-icon]引入vue项目后,use标签为0,已解决

这个bug我之前遇到过一次,解决了也就没记录 但是好记性不如烂笔头,这次重新遇到,又重新排查bug花了1个多小时 svg引入vue项目,需要依赖svg-sprite-loader npm install svg-sprite-loader在vue.config.js中 chainWebpack(conf…