C++:类和对象(2)

1. 类的默认成员函数:

类的默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成6个默认成员函数(构造函数,析构函数,拷贝构造函数,赋值重载函数,取地址重载(普通对象,const引用对象)),最后面两个取地址重载不重要,稍微了解一下即可。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值。默认长远函数很重要,我们从两个方面去学习:

  • 第一:我们默认写时,编译器默认生成的函数行为是什么,是否满足我们的需求。
  • 第二:黏一起默认生成的函数不符合我们的需求,我们需自己实现,如何实现?

2. 构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽名称叫构造,但是构造函数的主要任务并不是开空间创造对象,而是对象实例化时初始化对象。构造函数的本质是为了替代我们之前写的Stack 和 Date 类中的 Init 函数功能,构造函数自动调用的特点完美的替代了 Init 函数。

构造函数特点:

  1. 函数名与类名相同
  2. 无返回值
  3. 对象实例化系统会自动调用对应的构造函数
  4. 构造函数可以重载
  5. 如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示实现定义编译器将不再生成
  6. 无参构造函数、全缺省构造函数、我们不写编译器默认生成的构造函数,都叫做默认构造函数。但是三个函数有且只有一个能有效存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数函数是编译器默认生成呢个叫默认构造,实际上无参构造函数,全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造。
  7. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是否初始化是不确定的,看编译器,对于自定义类型成员变量,要求调用调用这个成员变量的默认构造函数初始化。如果这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数。那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,我们下个章节再讲。

注:C++把类型分为内置类型(基本类型)和自定义类型,内置类型就是语言提供的原生数据类型,如:Int/char/double/指针等,自定义类型就是我们使用 class/struct等关键字自定义的类型。

3. 析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧,函数栈帧销毁, 他就释放了,不需要我们管C++规定在对象销毁时自动调用析构函数,完成对象中资源清理释放工作。析构函数的功能类比我们之前 Stack 实现的 Destroy 功能,而像 Date 没 有 Destroy 其实就是没有资源释放,严格来说 Date 是不需要析构函数的。

析构函数的特点:

  1. 析构函数的函数名是在类名前加上符号 ‘~
  2. 无参数无返回值(这里跟构造函数类似,也不需要加 void )
  3. 一个类只能有一个析构函数,若显示未定义,编译器会自动生成默认的析构函数
  4. 对象生命周期结束后,系统会自动调用析构函数
  5. 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用它的析构函数
  6. 我们显示写析构函数,对自定义类型成员也会调用它的析构,也就是说自定义类型成员无论什么情况都会调用析构函数
  7. 如果类中没有生成资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如 Date ;如果默认生成的就可以用,也就不需要显示写析构,如MyQueue;但是有资源申请时,一定要自己写析构,否则会造成内存泄露,如Stack。
  8. 一个局部域的多个对象,C++规定后定义的先析构

4. 拷贝构造函数

如果构造函数的参数是第一个类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造函数是一个特殊的构造函数

拷贝构造的特点:

  1. 拷贝构造函数是一个构造函数的重载
  2. 拷贝构造函数的第一个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用。拷贝构造函数也可以多个参数但是第一个参数必须是类类型对象的引用,后面的参数必须有缺省值
  3. C++类型规定自定义类型的拷贝必须要调用拷贝构造,所以这里自定义类型传值传参和传值返回都必须调用拷贝构造完成
  4. 若未显示定义拷贝构造,编译器会自动生成拷贝构造函数。自动生成的的拷贝构造对内置类型的成员变量会完成值拷贝/浅拷贝(一个字节一个字节的拷贝),对自定义类型的成员变量会调用它的拷贝构造。
  5. 像 Date 这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的拷贝构造就可以完成我们需要的拷贝,所以不需要我们显示实现拷贝构造。像 Stack 这样的类,虽然也都是内置类型,但是_a指向了资源(也就是开辟了内存),编译器自动生成的浅拷贝/值拷贝不符合我们的需求,所以需要我们自己实现深拷贝(对指向的资源也进行拷贝)。这里有一个小技巧,如果一个类显示实现了析构并释放资源,那么他就要显示写拷贝构造,否则就不需要。
  6. 传值返回会创建一个临时对象调用拷贝构造,传值引用返回返回的是引用对象的别名(引用),没有产生拷贝。但是如果返回的对象是一个当前函数局部域的局部对象,函数结束就销毁了,那么使用引用返回是有问题的,这时的引用相当于野引用,类似于野指针一样。传引用返回可以减少拷贝,但是一定要确保返回对象,在当前函数结束后还在,才能引用返回。

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

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

相关文章

爬虫运行后数据如何存储?

爬虫运行后获取的数据可以存储在多种不同的存储系统中,具体选择取决于数据的规模、查询需求以及应用场景。以下是一些常见的数据存储方法: 1. 文件系统 对于小型项目或临时数据存储,可以直接将数据保存到本地文件中。常见的文件格式包括&…

[生物信息]单细胞数据分析入门学习笔记1

推荐课程:Analysis of single cell RNA-seq data (singlecellcourse.org) 1 关于《Analysis of single cell RNA-seq data》课程 如今,通过高通量测序(scRNA-seq)可以从单细胞获取全基因组转录组数据。scRNA-seq 的主要优势在于…

ArcMap 分析栅格欧式分配、构建趋势面、插值模型精度等功能操作

ArcMap 分析栅格欧式分配、构建趋势面、插值模型精度等功能操作今天进行 一、栅格欧式分配 1、对点要素进行空间分配 配置环境变量 点击确定后展示 2、对线要素进行空间分配 环境变量依然选择 road 相同,点击确定后展示 3、对面要素进行空间分配 环境配置与 road …

推荐在线Sql运行

SQL Fiddle 1、网址:SQL Fiddle - Online SQL Compiler for learning & practiceDiscover our free online SQL editor enhanced with AI to chat, explain, and generate code. Support SQL Server, MySQL, MariaDB, PostgreSQL, and SQLite.http://www.sqlfi…

MySQL 8.0 新特性汇总

文章目录 前言1. 运维管理 1.1 可持久化变量1.2 管理员端口1.3 资源组1.4 数据库粒度只读1.5 show processlist 实现方式1.6 加速索引创建速度1.7 控制连接的内存使用量1.8 克隆插件1.9 mysqldump 新增参数1.10 慢日志增强1.11 快速加列1.12 InnoDB 隐藏主键1.13 Redo 配置1.14…

使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面

以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信(这里以 TCP 通信为例)的代码示例,包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio,新建一个 Empty Activity …

记录blender学习过程中遇到的问题

物体发射的方向不对 被发射物体(例如一棵树)n键看旋转归0 切换正视图 将被发射物体的局部坐标的Z轴 指向 全局方向的X轴时 并且把粒子系统设置的物体旋转勾选上 方向就对了 做倒角发现有问题 检查缩放应用、面朝向、有没有重合点(融合点&am…

【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转

读写分离功能的背景及架构 当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而…

01-Chromedriver下载与配置(mac)

下载地址: 这里我用的最后一个,根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址:https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址:https://googlechromelabs.git…

MySQL——buffer poll

为什么要有buffer poll? 如果没有buffer poll,每次读取数据的时候都是从磁盘上读的,这样效率是很差的的。 所以有了提高效率的方式,就加上了一个缓存——buffer poll 所以,当我们读取数据的时候就有以下的方式 当读…

重磅升级:OpenAI o1模型上手实测,从芯片架构分析到象棋残局判断的全能表现

引言 昨日,在圣诞节系列发布会的第一天,OpenAI终于给我们带来了令人振奋的更新,这些更新有望塑造AI互动的未来。备受期待的OpenAI o1正式版的推出,标志着ChatGPT体验的重大进化,宣告了AI驱动应用新时代的开始。o1现已可…

oracle之用户的相关操作

(1)创建用户(sys用户下操作) 简单创建用户如下: CREATE USER username IDENTIFIED BY password; 如果需要自定义更多的信息,如用户使用的表空间等,可以使用如下: CREATE USER mall IDENTIFIED BY 12345…

IDL学习笔记(四)MODIS数据处理。MODIS数据介绍,以及Swath数据处理

MODIS数据处理 MODIS传感器介绍MODIS 数据产品Swath 数据Grid 数据 MODIS Swath 数据重投影对应ENVI接口UTM重投影 重投影后数据由ENVI版本,修改为GeoTiff格式。根据经纬度,快速重投影MODIS数据 下标 和 行列号转换 MODIS传感器介绍 MODlS (Moderate Re…

pushgateway HA高可用方案

未经本人同意不得转载,若引用请附上原文链接。 项目使用flink来处理kafka中的无界流数据,采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中,踩了一些坑。下面是过程,只想看最终方案的直接拉到最后。 先说…

burp常用机漏洞测试理论

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

【深度学习】手机SIM卡托缺陷检测【附链接】

一、手机SIM卡托用途 SIM卡托是用于固定和保护SIM卡的部件,通过连接SIM卡与手机主板的方式,允许设备访问移动网络,用户可以通过SIM卡进行通话、发送短信和使用数据服务。 二、手机SIM卡托不良影响 SIM卡接触不良,造成信号中断&…

【机器学习】深入解析 PCA 与三元组损失:从理论推导到实践应用

深入解析 PCA 与三元组损失:从理论推导到实践应用 PCA (Principal Component Analysis) 主成分分析详解1. 基本概念1.1 什么是 PCA?1.2 核心目标1.3 应用场景 2. 数学原理详解2.1 问题形式化2.2 数据预处理2.3 协方差矩阵的计算2.4 特征值分解2.5 最大方…

记录:ubuntu 使用chattts的过程。

你知道什么是穷人吗?穷人就是没钱还想学习。 git GitHub - 2noise/ChatTTS: A generative speech model for daily dialogue. 因为所以。cosyvoice,gpt-s . 0.先找一个目录吧。 1.命令行模式 duyichengduyicheng-computer:~/gitee$ git clone https:…

开源 - Ideal库 - Excel帮助类,ExcelHelper实现(五)

书接上回,我们继续来聊聊ExcelHelper的具体实现。 01、读取Excel到DataSet单元测试 在上一章我们主要讲解了读取Excel到DataSet的三个重载方法具体实现,还没来得及做单元测试,因此我们首先对这三个方法做个单元测试。具体代码如下&#xff1…

CCF-GESP 编程能力认证 C++ 七级 2024年9月份选择题详细解析

第 1 题 已知小写字母 b 的 ASCII 码为 98 &#xff0c;下列 C 代码的输出结果是&#xff08;B&#xff09;。 #include <iostream> using namespace std; int main() {char a b;a;cout << a;return 0; } A. b B. c C. 98 D. 99 【这题很简单&#xff0c;我们只…