构造析构理解与拷贝函数初识

1.        6个默认成员函数

----初始化和清理{        1.构造        2.析构        }

-----拷贝复制{        1.拷贝构造        2.赋值重载               }

------取地址重载{        1.普通对象        2.const对象取地址        }

注:构造函数的目的是初始化成员变量,而不是创造变量

析构函数的目的是清理需要清理的资源(指的是malloc,new,流,链接),而不是销毁变量

2.构造函数

1.分类:

        1.自己写

1.自己写带参构造或半缺省构造,必须通过外界传值初始化成员变量(非默认构造)

2.自己写无参构造或全缺省构造,可以不传参。例:实现栈可以全缺省让外界决定是否开始就确定容量。(默认构造)

(使用注意:1.在前面用public访问限定符修饰,因:默认private

                      2.一般无参构造和全缺省构造只写其一,因:外部调用不传参会构成歧义(是否重载与歧义无关)

                      3.初始化调用不需传参的不能写空括号,因:test n1(),类名+对象名+()与函数声明歧义。)

        2.默认生成

不写构造时,编译器会为你生成一个构造,默认生成的为公有的无参构造,编译器可能处理或不处理你的内置类型变量。(同C)。会调用你的自定义类型变量的默认构造,如果没有默认构造就报错。通过层层调用,直到全剩内置类型结束。(默认构造)

注意:关于自定义类型初始化处理,编译器无论在哪种情况下,都尝试调用此类型的默认构造,所以不必纠结,只当作  初始化外面类的对象时  要初始化其成员变量,内置类型不做处理,一旦初始化到了自定义类型,这个变量就会自己调用默认构造类型。(你无法在初始化外部对象时给内部自定义类型的要传参的构造函数传参,编译器不知道你给哪个传,也没有这个语法。)

例:外部类构造由编译器生成

外部构造由自己写

(验证编译器是否会调用内部自定类型默认构造函数与外部类型的构造无关,只要初始化到自定义类型了,就会调用)

2.默认构造的定义:

无需传参的构造函数:1.无参构造。2.全缺省参数构造。3.编译器生成的构造。

                                                (一般三者取其一)

3.总结:

什么时候用:

        1.缺省:涉及顺序表等可传参确定初始容量的,或其他可能在某些场景需要手动初始化特定值的。

        2.手动无参:内置类型需要初始化(也可以换为给内置类型变量给缺省值),或者需要动态开辟的。

        3.编译器构造:全为自定义类型,只需要在自定义类型里手动写构造,外部直接调。例子:双栈一类。

什么时候不用:

1.成员全是自定义类型,可以不用手写。(原因往上翻)(极少情况)

        内置类型少,不需外部给特殊值,给缺省值就行的,可以不用手写。

2.大多数需要通过各种方式初始化内部内置类型变量的要手写。

补充:给内置类型变量缺省值(C++11的补丁)

定义:在定义类型时就给予内置类型变量一个默认值。对象初始化时,其优先对其内容改变。

来源:编译器给的构造函数不能满足大部分程序员,C++委员会就新提供了一种给内置类型变量默认值的方式。

名称来源:

因为1.此时类没有任何一个空间已开辟,不能叫赋值,

2.而这种行为又可以通过构造函数覆盖使得默认值改变,

所以叫 给予变量缺省值。

使用注意:如果同时有构造和缺省值,类实例化(对象初始化)时,先给内置类型变量赋默认的缺省值,再调构造覆盖它。(编译器构造不会理睬已赋缺省值的变量)

3.析构函数

使用注意:由于析构函数一般由编译器调用(也可以自己调用,但编译器在这之后会自己调用一次,往往会造成许多错误:free两次同样的空间。。。),不允许传参,也就不允许重载,只能有一个析构。

1.编译器的析构:

唯一作用是对自定义类型变量调用其析构,内置类型不管。(本身对象要销毁,内变量都要销毁,到自定义类型变量销毁时,自然就会自己调用析构,不用纠结编译器析构的用处)

2.什么时候需要析构:

1.类里对成员变量有malloc,fopen,new,链接等操作的,需手动写

2.没有上述的,不用写。(内部自定义类型变量有....在变量类里写)

4.拷贝构造

1.属于

构造函数的一个重载形式,但编译器会在不写的情况下生成,也就是说一个类里至少会有两个构造。

拷贝构造十分特殊,需与构造区分。

2.作用

对象初始化时可以通过拷贝一个相同类的对象来初始化。

例子:1.将对象以实参形式传给形参(形参是实参的拷贝,会调用拷贝构造来初始化形参)

2.外部调用拷贝构造初始化一个一模一样的对象。

3.规定

参数只能是一个接受实参的同类引用

Qt:1.为什么不能是对象接受而是引用接受。

Ans:对象接受会造成无限递归调用,使用拷贝构造要传参,将实参对象给形参要调用拷贝构造拷贝,使用拷贝构造要传参......

(编译器这里会当作语法错误检查)。

Qt:2.为什么不能用指针接收?

Ans:指针是会达到与引用同样效果的,但是由于拷贝构造在1.对象间相互赋值 2.传参 时会自动调用拷贝构造,所以需要一定的格式,引用更为方便,所以编译器认为:指针做参数的构造不是拷贝构造。不会调用指针实现的拷贝效果。

4.分类

1.编译器默认生成的为浅拷贝,或叫值拷贝。

内置类型会按地址一字节一字节地拷贝给对象(值拷贝),内置类型会调用它的拷贝构造函数拷贝(可能是深拷贝或浅拷贝)。(同构造,层层调用)

2.自己写的,分为浅拷贝和深拷贝

1.浅拷贝 

只会把值拷贝给对应对象。

缺点:如果对象里有指针,那么两个对象的指针变量会指向同一块空间,空间被共享,而不是拷贝!

2.深拷贝

如果被拷贝对象里有一块空间,深拷贝后,新对象会自己另外申请一块空间。(必须手动完成)

图为栈的深拷贝。

3.什么时候要用深拷贝?

在类中有指针(包括数组)时:

1.外部以对象初始化另一对象时

2.对象赋值时

4.什么时候不用深拷贝?

没有指针就不用

1.形参接受不用(形参接收如果不需要改变值可以考虑const引用接收,节省成本还不用考虑被修改)

注:一般不写析构函数就不写拷贝构造,写了拷贝构造就要写(满足条件同,有指针或一些值指向资源,如:malloc,流,new)

5.初识运算符重载

引子:如果一个类为记录日期,怎么比较类的两个对象的日期先后。Date1>Date2外部可以这样实现吗?

定义:

为对象间的运算符赋予自己的含义。

摘自菜鸟教程

关键字:operator

语法:operator运算符 构成函数名,前加返回值,后加参数列表,当作正常函数在类中定义;

图为类外运算符重载,可以定义两个不同或同类对象运算符比较。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】生命周期

生命周期钩子(lifecycle-hooks) 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数&a…

鸿蒙实战开发-如何实现查看系统相册、最近删除、收藏夹操作功能

介绍 本示例主要展示了相册相关的功能,使用ohos.file.photoAccessHelper 接口,实现了查看系统相册、创建用户相册、查看相册照片、用户相册文件添加和删除、以及预览图片、最近删除、收藏夹操作等功能; 效果预览 使用说明 主界面:查询显示…

【基于PSINS工具箱】组合导航,EKF与UKF的对比,使用153模型

代码简述 【务必注意】 需要事先安装PSINS工具箱!!! 如果没有工具箱,网上面很多,实在找不到可以找我要链接。没有工具箱是无法直接运行本程序的。 程序根据153的模型(15维状态量、3维GNSS观测量),在自己定义了一个运动路径后,使用EKF和UKF对状态进行估计,并绘制轨迹…

PostgreSQL入门到实战-第十四弹

PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…

OpenHarmony应用编译 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境:Windows 11 编译环境:Ubuntu 22.04 开发板型号:DAYU 200(RK3568) 系统版本:OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

element用户上传头像组件带大图预览,和删除功能

element 用户上传组件不支持大图预览&#xff0c;拿组件的简单修改一些&#xff0c;发表上来主要是记一下&#xff0c;以后可以用 效果图 <template><div class"flex-img"><div class"el-upload-list el-upload-list--picture-card" v-sh…

论文笔记:The Reversal Curse: LLMs trained on “A is B” fail to learn “B is A”

iclr 2024 reviewer 评分668 1 intro 论文揭示了自回归大模型&#xff08;LLM&#xff09;中令人惊讶的泛化失败【反转诅咒】 如果模型在“A is B”形式的句子上进行训练&#xff0c;它不会自动泛化到相反的方向“B is A”通过对“Uriah Hawthorne 是深渊旋律的作曲家”等虚构…

微服务项目sc2024父工程

1.基础版本要求 jdk 17maven 3.9mysql 8.0spring boot 3.2.0spring cloud 2023.0.0spring cloud alibaba 2022.0.0.0-RC2 2.创建父工程 2.1.字符编码 2.2.java编译版本 2.3.注解生效激活 2.4.File Type过滤 2.5.父工程中只保留pom文件,其余的删了 3.父工程pom文件 <?xm…

Covalent Network(CQT)推出以太坊质押迁移计划,以增强长期结构化数据可用性、塑造万亿级 LLM 参数体系

作为 Web3 领先的链上数据层&#xff0c;Covalent Network&#xff08;CQT&#xff09;宣布了其将质押操作从 Moonbeam 迁移回以太坊的决定。此举是 Covalent Network&#xff08;CQT&#xff09;走向以太坊时光机&#xff08;EWM&#xff09;的第一步&#xff0c;EWM 是一个为…

TensorFlow学习之:深度学习基础

神经网络基础 神经网络是深度学习的核心&#xff0c;它们受人脑的结构和功能启发&#xff0c;能够通过学习大量数据来识别模式和解决复杂问题。神经网络的基本工作原理包括前向传播和反向传播两个阶段。 前向传播&#xff08;Forward Propagation&#xff09; 前向传播是神经…

OpenC910 datasheet 2.0 翻译

概述 C910是由THEAD半导体有限公司开发的一款RISC-V兼容的64位高性能处理器。它通过架构和微架构创新&#xff0c;在控制流、计算和频率方面提供行业领先的性能。C910处理器基于RV64GC指令集&#xff0c;并实现了XIE&#xff08;XuanTie指令扩展&#xff09;技术。C910采用先进…

友思特应用 | 高精度呈现:PCB多类型缺陷检测系统

导读 PCB等电子产品的精密生产制造过程中&#xff0c;往往需要将缺陷问题100%高精度暴露。友思特 PCB 多类型缺陷检测系统&#xff0c;借由Neuro-T深度学习模型自动排查全部微小缺陷&#xff0c;为工业 PCB 生产制造提供了先进可靠的质量保障。 在现代制造业中&#xff0c;尤其…

TLF9471 - High-Speed CAN FD Transceiver

1 框图描述 2 功能描述 CAN收发器被设计用来承受汽车应用的恶劣条件&#xff0c;并支持12V应用。   SBC的控制器区域网络&#xff08;CAN&#xff09;收发器部分在汽车和工业应用中提供高速&#xff08;HS&#xff09;差分模式数据传输&#xff08;最高可达2Mbaud&#xff09…

kali使用msf+apkhook520+cploar实现安卓手的攻击

学习网络安全的过程中&#xff0c;突发奇想怎么才能控制或者说是攻击手机 边找工作边实验 话不多说启动kali 一、使用msfapktool生成简单的木马程序 首先使用kali自带的msfvenom写上这样一段代码 选择安卓 kali的ip 一个空闲的端口 要输出的文件名 msfvenom -p android/met…

【软件测试】个人博客系统测试

个人博客系统测试 一、项目背景1.1 技术背景1.2 功能背景 二、自动化测试2.1 什么是自动化测试2.2 通过使用selenium进行自动化测试的编写&#xff08;Java实现&#xff09;2.3 编写测试用例&#xff0c;执行自动化测试2.3.1 输入用户名:test,密码:123&#xff0c;登录成功2.3.…

深度学习图像处理04:图像分类模型训练实战——动物分类

这篇博文不涉及理论知识&#xff0c;主要通过一个完整的深度学习模型训练流程&#xff0c;直观地了解深度学习图像分类任务。有关理论的部分&#xff0c;之前几篇博文已经涉及基础部分&#xff0c;之后也会对一些理论进行补充。 本文将结合代码&#xff0c;主要介绍三部分内容…

halcon缺陷检测-印刷品检测(差异化模型),键盘字符缺陷检测

前言 在实际项目中&#xff0c;印刷品缺陷检测是缺陷检测中的难点项目。通常印刷品检测往往具备缺陷小&#xff0c;缺陷所在位置不固定&#xff0c;出现少印或者多印的情况。并且由于产线原因&#xff0c;大量的印刷品在视野中的大小并不是完全一致的&#xff0c;可能出现细微…

【UE5 C++】访问修饰符public/protected/private继承

限制类与类之间访问级别的方法 public 在类中创建一个public的部分&#xff0c;即" public: "&#xff0c;public之下的所有内容都是公共的,可以在类之间访问 private&#xff08;最常见&#xff09; 如若没有指明修饰符&#xff0c;则默认为private 不能在类的外…

文本处理常见命令

目录 前言-了解Linux目录结构 一、cat-查看文件内容 1.表现形式 2.常用选项 3.示例 二、more-查看文件内容 1.表现形式 2.交互操作方法 3.示例 三、less-查看文件内容 1.表现形式 2.交互操作方法 四、head-从头查看文件内容 五、tail-从尾查看文件内容 六、wc-统…