类和对象之六个默认成员函数

目录

1.构造函数

2.析构函数

3.构造函数(重载)

4.拷贝构造

4.1特征:

4.2写法:

4.3浅拷贝和深拷贝

5.运算符重载

6.&运算符重载和const成员

 6.1权限问题

Date类中是否加const修饰 

6.2取地址及const取地址操作符重载


🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉 


1.构造函数

        构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务 并不是开空间创建对象,而是初始化对象

特征:

        不开空间

        函数名与类名相同

        无返回值

        对象实例化时编译器自动调用对应的构造函数

        构造函数可以重载(多个构造函数,多个初始化方式)

        

调用歧义 -只能存在一个构造。👇

 


 

2.析构函数

特征:

  1. 与构造函数功能相反,对象在销毁时会自动调用析构函数1,完成对象中资源的清理工作(想当于Destroy())
  2. 在类名前加~(按位取反)
  3. 无参数无返回值
  4. 自动调用
  5. 一个类只有一个析构
  6. 内置类型不做处理,自定义类型去调用它的析构。

 

像申请空间的值,有资源需要处理,需要调用析构函数。

总结:1. 有资源需要显示清理,就需要写析构,如:Stack list

          2.有两种场景不需要显示析构,默认生成就可以

                a、没有资源需要处理。如Data

                b、内置类型成员没有资源需要清理。如MyQueue

 

 

 创建对象初始化流程👇

Time _t是自定义类型,我们去Time类里找,但Time类里是内置类型,所以Time _t不会初始化。(内置类型初始化看编译器,有的初始化为1,有的不初始化)

3.构造函数(重载)

内置类型/自定义类型

        内置类型:int/char/…/指针、语言提供的数据类型

        自定义类型: class/struct/union、自己定义的类型

自定义类型的尽头还是内置类型

编译器自动生成的构造函数,对于内置类型成员变量不做处理(可处理,可不处理,看编译器),对于自定义类型成员才会调用无参构造👇(没有无参构造会报错)。

                                                不传参就可以调用那个构造

默认构造函数不传参就可以调用的函数就是默认构造函数。

        无参的构造函数和全缺省的构造函数都成为默认构造函数,并且默认构造函数只能有一个。

注意:无参构造函数、全缺省构造函数、编译器默认生成的构造函数,都可以认为是默认构造函数.

 全缺省构造函数👇

 

总结:

1.一般情况构造函数都需要我们自己显示的去实现。

2.只有少数情况下可以让编译器自动生成构造函数。(类似MyQuee,类型全是自定义类型)

3.C++11中对内置类型做了调整,在内置类型声明处,用全缺省值给其赋值。


 

4.拷贝构造

4.1特征:

1.拷贝构造函数是构造函数的一个重载形式

2.参数只有一个是类的类型对象的引用。

        a.拷贝构造函数也是一构造函数,因此不能有返回值

        b.该函数参数是自身类型的对象的引用

        c.自动生成的缺省拷贝构造函数,作为该类的公有成员,否则无法进行默认的拷贝构造

3.拷贝构造通过创建临时对象来返回值。临时对象具有常性。一说到常性,就必须了解权限的放大和缩小。(待放链接)

4.拷贝构造函数是给未定义的对象拷贝构造。

注意:拷贝构造是给未定义的对象。 

 

函数传参自定义类型时,要调用拷贝构造👇👇👇,Date d(d2)

func先调用func函数,然后传参拷贝构造Date d(d2),调用Data构造函数,调完返回。

如果拷贝构造时我们不用引用,去掉&会怎么样。👇👇👇

4.2写法:

Data d(d1);
Data d2 = d3;

4.3浅拷贝和深拷贝

        如果没有自定义赋值构造函数,则系统会创建默认的赋值构造函数,但系统创建的默认复制构造函数只会执行浅拷贝即将被拷贝对象的数据成员的值一一赋值给新创建的对象若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复delete而出错。

浅拷贝:按字节一个一个拷贝,sizecapacity拷贝没问题,但array是指针,指向栈顶,st1st2公用一个空间,会析构两次。

默认拷贝:值拷贝(一次拷贝过来)也就是浅拷贝。

总结:

        1、如果没有管理资源,一般情况不需要写拷贝构造,默认生成的拷贝构造就可以。

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

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

        4、如果内部有指针或一些值指向资源,需要显示写析构释放,通常就需要写构造完成深拷贝。如Satck Queue List


5.运算符重载

自定义类型可以用运算符,并且控制运算符的行为,增强可读性。

        ·operator+操作符构成函数名

        ·返回值:得看操作符是声明类型(Date类)

        ·关键字operator后面接需要重载的运算符符号

        ·不能通过连接其他符号来创建新的操作符:比如operator@

        ·重载操作符必须有一个类类型参数(类的类型的数据)

        ·用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义

        ·作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this

        .*      ::      sizeof           ?:         . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现  

                   .*              :: 域作用限定符, ?: 三目操作符     .  对象.成员名


6.&运算符重载和const成员

          const 修饰的类成员函数称之为 const 成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的 this 指针,表明在该成员函数中 不能对类的任何成员进行修改。

我们知道this应该是  Date *const this 此时this指向不可变

修饰之后应该是   const Date* const this 此时this指向的值也不可改变

 6.1权限问题

权限只能缩小、平移,不能放大。👆👆👆

所以需要加const来保证逻辑闭环。

Date类中是否加const修饰 

6.2取地址及const取地址操作符重载

        这两个默认成员函数一般不用重新定义 ,编译器默认会生成。


 

last but not least,创作不易,望读者三连三连三连支持💖

重要的事情说三遍💖

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

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

相关文章

vue-img-cutter 图片裁剪详解

前言&#xff1a;vue-img-cutter 文档&#xff0c;本文档主要讲解插件在 vue3 中使用。 一&#xff1a;安装依赖 npm install vue-img-cutter # or yarn add vue-img-cutter # or pnpm add vue-img-cutter 二&#xff1a;构建 components/ImgCutter.vue 组件 <script se…

sh包装脚本

两个脚本,运行的时间间隔分别是一分钟和五分钟,放入到sh文件中,挂在后代,脚本里面的路径最好是绝对路径。 新建sh文件 新建 run_test.sh 文件,使其可以运行两个不同的 Python 脚本,一个每分钟运行一次,另一个每五分钟运行一次。下面是修改后的 run_test.sh 文件的示例:…

光伏SRM供应商管理解决方案

供应商管理是光伏企业中重要的一环&#xff0c;通过SRM管理供应商&#xff0c;可以提高产品质量&#xff0c;降低采购成本&#xff0c;并集成供应链&#xff0c;提高核心竞争力。 一、搭建管理系统 分为供应商和商户&#xff0c;供应商需要完善基本信息、类别、等级、产品概要…

typescript TS 错误码大全

code 类型 英文描述 中文描述 1002 错误 Unterminated string literal. 未终止的字符串文本。 1003 错误 Identifier expected. 应为标识符。 1005 错误 {0} expected. 应为“{0}”。 1006 错误 A file cannot have a reference to itself. 文件不能引用自身。 1009 错误 Trail…

大历史下的 tcp:一个松弛的传输协议

如果 tcp 是一个相对松弛的协议&#xff0c;会发生什么。 所谓松弛感&#xff0c;意思是它允许 “漏洞”&#xff0c;允许可靠传输的不封闭&#xff0c;大致就是&#xff1a;“不求 100% 可靠&#xff0c;只要 90%(或多或少) 可靠&#xff0c;另外 10% 的错误可检测到” or “…

Python扩展模块的开发

有关python C扩展开发的教程可以参考概述 — Python 3.12.3 文档。项目已经发布至python官方的pypi里了。具体详情请见AdroitFisherman PyPI。目前该项目还处在测试阶段。尚有部分模块需要开发和测试。 项目结构 项目结构见下图&#xff1a; 代码展示与说明 以单链表(SingleL…

C++语法|bind1st和bind2nd的用法

文章目录 What什么是&#xff1f;How什么时候用&#xff1f;如何用&#xff1f;bind1st和bind2nd的底层实现原理my_find_if分析myBind1st分析 What什么是&#xff1f; bind1st 和bind2nd分别是一个用来绑定函数对象的第一个参数或第二个参数的适配器。它在 C98 和 C03 标准中很…

5.7代码

1.环境治理 分析&#xff1a;最开始进入了一个误区&#xff0c;觉得都有通路了直接算通路就可以&#xff0c;后来才发现居然是最小路径的总和&#xff0c;所以大概是每减一次都要算一次各点之间的最小路径了&#xff0c;然后是循环&#xff0c;到需要的条件为止 总的来说思路不…

昂科烧录器支持Infineon英飞凌的三相电机驱动器TLE9877QXA40

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Infineon英飞凌的三相电机驱动器TLE9877QXA40已经被昂科的通用烧录平台AP8000所支持。 TLE9877QXA40是一款单芯片三相电机驱动器&#xff0c;集成了行业标准的ARMCortex™M3 内…

【前端】实现表格简单操作

简言 表格合并基础篇 本篇是在上一章的基础上实现&#xff0c;实现了的功能有添加行、删除行、逆向选区、取消合并功能。 功能实现 添加行 添加行分为在上面添加和在下面追加行。 利用 insertAdjacentElement 方法实现&#xff0c;该方法可以实现从前插入元素和从后插入元…

MySQL学习笔记9——触发器和权限管理

触发器和权限管理 一、触发器1、如何操作触发器2、触发器的优缺点 二、权限管理1、角色的作用2、角色的操作3、用户的操作 一、触发器 当商品信息和库存信息分别存放在两个不同的数据表中时&#xff0c;可以创建一个触发器&#xff0c; 让商品信息数据的插入操作自动触发库存数…

游戏中常用的设计模式及场景

常用的游戏设计模式及其场景有&#xff1a; 状态模式&#xff08;State Pattern&#xff09;&#xff1a;该模式定义了一系列状态和状态之间的转移关系&#xff0c;可以用于控制游戏中各个元素的行为。例如&#xff0c;在一款格斗游戏中&#xff0c;玩家的角色可以处于站立、跑…

安卓通信方式简介

目录 一、Binder二、Socket三、Binder与Socket四、Handler 一、Binder Binder作为Android系统提供的一种IPC机制&#xff0c;无论从系统开发还是应用开发&#xff0c;都是Android系统中最重要的组成。 二、Socket Socket通信方式也是C/S架构&#xff0c;比Binder简单很多。在…

Llama3-Tutorial之Llama3 Agent能力体验+微调(Lagent版)

Llama3-Tutorial之Llama3 Agent能力体验微调&#xff08;Lagent版&#xff09; 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. 微调过程 使用XTuner在Agent-FLAN数据集上微调Llama3-8B-Instruct&#xff0c;以让 Llama3-8B-Instruct 模型获得智能体能力…

期权怎么开户?

今天期权懂带你了解期权怎么开户&#xff1f;近年来&#xff0c;随着股市的持续低迷&#xff0c;市场交易痛点越发明显的氛围中&#xff0c;所以有人看到了双向交易的期权。 期权怎么开户&#xff1f; 1、首先是证券账户内的资金需要满足50万保留20个交易日&#xff1b; 2、其…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下&#xff1a; 只粘贴了js方法哦&#xff0c; methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

L2网络和L3网络(L2VPN和L3VPN)

L2网络和L3网络是计算机网络体系结构中按照OSI模型或TCP/IP模型的层次来区分的两种不同类型的网络。 L2网络&#xff08;数据链路层网络&#xff09; L2网络指的是第二层网络&#xff0c;对应于OSI模型中的数据链路层。这一层的主要职责是处理数据帧&#xff08;frames&#…

Google Play开发者账号为什么会被封?如何解决关联账号问题?

Google Play是Google提供的一个应用商店&#xff0c;用户可以在其中下载并安装Android设备上的应用程序、电影、音乐、电子图书等。Google Play是Android平台上较大的应用市场&#xff0c;包含了数百万个应用程序和游戏。但是谷歌对于上架应用的审核越趋严格&#xff0c;开发者…

【AIGC调研系列】VILA-1.5版本的视频理解功能如何

VILA-1.5版本的视频理解功能表现出色&#xff0c;具有显著的突破。这一版本不仅增强了视频理解能力&#xff0c;还提供了四种不同规模的模型供用户选择&#xff0c;以适应不同的应用需求和计算资源限制[1][2][3]。此外&#xff0c;VILA-1.5支持在笔记本等边缘设备上部署&#x…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…