类的默认成员函数

news2025/1/15 13:58:37

为什么会有构造函数和析构函数呢?
1、初始化和销毁经常忘记
2、有些地方写起来很繁琐.
Stack有了构造和析构,就不怕忘记写初始化和清理函数了,也简化了
例如在队列oj时,忘记释放,造成内存泄漏
在这里插入图片描述

构造函数

主要任务:初始化对象
我们不写,编译器会自己生成
特征:

  1. 函数名和类名相同
  2. 无返回值(也不需要写void)
  3. 对象实例化时编译器自动调用对应的构造函数
  4. 构造函数可以重载

构造函数需特殊对待,在调用上也很特殊(如果构造函数不是默认构造函数
默认构造函数是不需要传参的构造函数(我们没写编译器默认生成的构造函数,全缺省构造函数,无参的构造函数)

那么默认生成的构造函数,处理下面的成员变量仍然是随机值?

在这里插入图片描述
它都做了什么?
我们不写,编译器默认生成构造函数,内置类型不做处理,自定义类型会去调用他的默认构造。
有些编译器也会处理但是那是个性化行为不是所有编译器都会处理
在这里插入图片描述
C++区分内置类型和自定义类型
1、内置类型/基本类型、语言本身定义的基础类型int/char/double/指针(任意类型的指针)等等
2、自定义、用struct/class等等定义的类型

结论
1、一般情况下,有内置类型成员,就需要自己写构造函数,不能用编译器自己生成的
2、全部都是自定义类型成员,可以考虑让编译器自己生成(编译器会调用自定义类型的构造函数,当然自定义类型的构造函数本身还是需要我们来写的,在这个前提下,只有自定义类型的类就不需要写构造函数)

按理说默认生成的构造函数应该处理一下,不应该是随机值
C++11 给的补丁
在声明成员变量时,给缺省值,给默认构造用,而且这不是初始化,只是声明
在这里插入图片描述

析构函数

功能:对象销毁时自动调用析构函数,完成对象中资源的清理工作(如动态申请的资源)

特性:

  1. 析构函数名是在类名前面加上字符~
  2. 无参数,无返回值类型
  3. 一个类只有一个析构函数,未显示定义,系统自动生成默认的析构函数。并且析构函数不可以重载
  4. 对象声明周期结束,C++编译器自动调用析构函数

默认生成的析构函数做了什么?
1、内置类型成员不做处理
2、自定义类型会去调用他的析构函数

什么时候写,什么时候不写?
1、一般情况下,有动态申请资源,就需要显示写析构函数释放资源
在这里插入图片描述

2、没有动态申请的资源,不需要写析构
在这里插入图片描述

3需要释放资源的成员都是自定义类型,不需要写析构(前提:自定义类型都定义好析构函数)
在这里插入图片描述

析构函数调用顺序问题

函数入栈,后进先出,则后实例化的对象先析构

拷贝构造函数

用一个已经存在的对象初始化另一个对象–拷贝构造
这和 已经存在的两个对象之间复制拷贝 还不一样 (涉及运算符重载函数再解释)
在这里插入图片描述
拷贝构造函数的定义是这么说的
在这里插入图片描述

特征:
拷贝构造函数也是特殊的成员函数,其特征如下:
1.拷贝构造函数是构造函数的一个重载形式
⒉.拷贝构造函数的参数只有一个必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
3.若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

先看看拷贝构造会在什么时候发生

在这里插入图片描述
1.函数参数类型为类类型对象
C++规定了,必须要调用拷贝构造去完成
在这里插入图片描述
2.使用已存在对象创建新对象
在这里插入图片描述
红框也会调用1次拷贝构造
并且红框上面,为什么这里拷贝函数只调用一次,不是应该2次吗,自定义类型赋值一次,函数传值返回的临时空间拷贝一次
答:连贯的构造和拷贝构造 会被优化成一次

3.函数返回值类型为类类型对象
在这里插入图片描述
下面再来说说无穷递归调用是如何发生的

⒉.拷贝构造函数的参数只有一个必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

在这里插入图片描述
拷贝构造函数Date(Date d)以传值方式定义形参,在调用 Date d2(d1)初始化d2时,Date d和d1需要拷贝构造,他们是自定义类型,等价于Date d(d1)来初始化d这个形参,Date d(d1)又会有一个新的形参d需要初始化,如此下去,造成死循环

正确写法,要加上const防止修改已经初始化好的对象数据
在这里插入图片描述
默认生成的拷贝构造函数都干了什么?
1、内置类型成员完成值拷贝/浅拷贝。
2、自定义类型成员会调用他的拷贝构造。

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

在这里插入图片描述
日期类直接调用默认的拷贝函数,我们可以不写,就可以完成
但是想stack就需要我们定义拷贝构造函数,而且需要深拷贝,简单的值拷贝,导致st1,st2的值是同一个(数据依次拷贝,top和capacity没事,但a指向的是同一块空间)
造成问题
1.一个数组中的改变会影响另一个
2.析构两次同一块空间,报错
在这里插入图片描述

这个例子可以理解祖师爷为什么规定了需要调用拷贝构造(前提是实现了情况下),而不是像C语言 传值拷贝,导致指向同一块空间

一些调试技巧,利用this看实例化对象
在这里插入图片描述

再来看看为什么要有引用

在这里插入图片描述
上面两种情况,日期类是函数参数类型为类类型对象会调用构造拷贝12字节(类大小)还是传引用都还行,可以接受

在这里插入图片描述
此时函数参数为类类型需要拷贝构造,而且是深拷贝代价比较大,不是简单的值拷贝,就不再想用值传递,而是用引用,提高了效率
在这里插入图片描述

在这里插入图片描述
这种情况也不想传值返回,仍然需要拷贝构造给临时空间返回
减少拷贝的写法
在这里插入图片描述

不能返回被销毁的局部变量的引用
在这里插入图片描述
暂时只能这么写
在这里插入图片描述
虽然效率低一点,但是正确

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

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

相关文章

spark on k8s 部署的一点理解

Running Spark on Kubernetes - Spark 3.4.0 Documentation (apache.org) 前提条件 1. 本地有spark安装包,以便于执行 spark submit 命令 2. k8s 集群,以及本地的有 kubectl 并且配置的用户包含相关权限,具体可以参考官网 一些观念的转变 …

二百左右的蓝牙耳机哪款好?200左右音质最好的蓝牙耳机

在日常生活中离不开智能手机,特别是对无线蓝牙耳机的需求程度也越来越高,但是市面上有很多的蓝牙耳机戴久了耳朵会出现不舒服,为了获得更好的使用体验,我整理了市面上200左右价位佩戴和音质都表现不错的蓝牙耳机。 一、南卡小音舱…

Leetcode 并查集详解

在一些应用的问题中,需将n个不同的元素划分成一组不相交的集合。开始时,每个元素自成一格单元素集合,然后按一定顺序将属于同一组的元素的集合合并。其间要反复用到查询某个元素属于哪个集合的运算。适合于描述这类问题的抽象数据类型称为并查…

【22】linux进阶——文本处理工具:cut、awk、sed

大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…

一段凄惨Android 面试经历分享,败在了项目架构原理上……

大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。 这是一位网友分享的面试经历,他准备了3个月,刚刚参加完字节跳动的第三面,视频面&#xff…

数说故事联合中山大学国际关系学院共建「国关数据实验室」,深化数据科学与国际关系融合创新

4月9日,数说故事联合中山大学国际关系学院共建的「国关数据实验室」正式启动,此次强强联合是双方在国际关系领域的一项创新尝试,该实验室旨在整合数说故事和国际关系学院师生的资源优势,将数据科学与国际关系研究相结合&#xff0…

真实还原美团4面经历,低学历成功拿到20K Offer...

个人背景 如标题所示,我的个人背景非常简单,软件测试经验 1 年半,学历普通,2 本毕业后出来就一直在做功能测试,在公司每天重复的工作对我的技术提升并没有什么帮助,但小镇出来的我也深知自我努力的重要性&…

Binder 与 四大组件工作原理 其一

Binder Binder的组成结构 Binder的架构如图所示 ServiceManager负责把Binder Server注册到一个容器中。 我们可以这样理解Client、Server 、ServiceManager、Binder Driver之间的关系: 把ServiceManager比喻成电话局,存储着每个住宅的座机电话。张三给…

记录-Vue移动端日历设计与实现

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 工作中遇到一个需求是根据日历查看某一天/某一周/某一月的睡眠报告,但是找了好多日历组件都不是很符合需求,只好自己手写一个日历组件,顺便记录一下。 先看看UI给的…

linux文件编辑与编辑命令

文章目录 一、linux文件编辑与编辑命令总结 一、linux文件编辑与编辑命令 Linux mkdir命令:创建目录 Linux more命令:显示文本文件内容 Linux cat命令:连接文件并打印到标准输出设备上 Linux grep命令:检索文件内容 Linux rm命令:删除文件或目录 Linux touch命令:修改文件的时…

15款时间计划、任务管理APP/软件对比(团队\个人)

15 款不同类型的日程、任务管理应用:1.PingCode;2.Worktile;3.Todoist;4.Trello;5.Microsoft To Do;6.Asana;7.Google 任务;8.Notion;9.Monday.com;10.Teambi…

Matlab对日期变量和时间变量的管理

Matlab2012a内置了三个函数 datanumdatevecdatestr 靠这三个函数,可以基本实现日期变量和时间变量的管理。下面直接来看。 (1)datanum 这个函数用来将字符串,日期矢量转为通用日(数值型)。所谓的通用日…

js特殊对象 - RegExp对象(正则表达式)

1、概述 正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,获取将字符串中符合规则的内容提取出来。 使用typeof检查正则对象,会返回object。 2、创建正则对象 2.1、使用对象创建 语法…

Java spring 注解 @PostConstruct 实战讲解

前言 在最近的学习中,发现了一个非常实用的注解 —— PostConstruct。通过学习了解,逐步发现它能帮助我更轻松的解决不少原本很复杂的问题。 下面,结合实例介绍 PostConstruct 注解的特性,因为PreDestroy基本用不到,所…

C++算法初级11——01背包问题(动态规划2)

C算法初级11——01背包问题(动态规划2) 文章目录 C算法初级11——01背包问题(动态规划2)问题引入0-1背包问题分析0-1背包问题的形式化分析优化 问题引入 辰辰采药 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大…

Ubuntu开机自启动一些东西

有三种方式做开机自启动 目录 1.免除sudo密码 2.Startup 2.desktop 3.service 1.免除sudo密码 做完这一步你的所有sudo命令都不会再让你输密码了 如果你的开机自启动的东西需要sudo,那么这一步就是必须的,如果不需要sudo,那么这一步可…

Linux安装kubectl

前言 以下所有命令基于CentOS7.9系统,官方参考文档:> 文章最后附有一键安装的脚本,可以直接运行脚本进行安装 下载安装文件 1. 下载最新发行版 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/st…

C嘎嘎~~[类 中篇]

类 中篇 6.类的实例化7.类对象模型8.this指针8.1this指针是什么8.2this指针的特性 6.类的实例化 什么叫类的 实例化?? 首先, 我们应该关注这个"实" — 实际存在的, 它的反义词是 “虚” — 不存在的. > 类中的成员变量是虚的(相当于声明), 在类外面创建的对象是…

《程序员面试金典(第6版)》面试题 16.06. 最小差(双指针,pair数据结构)

题目描述 给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差 示例: 输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}输出:3,即数值对(…

Power BI动态日期轴方法总结

趋势,应该是我们做可视化时最熟悉的一个词了,看趋势自然离不开日期,年度趋势,月趋势,周趋势等等。Power BI中我们可以借助于计算表,计算组,字段参数来实现动态实时轴的效果。 计算表实现动态日…