【C++】入门【三】

本节目标


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

二、 构造函数

三、析构函数

四、拷贝构造函数

五、赋值运算符重载

六、const成员函数

七、取地址及const取地址操作符重载


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

  • 如果类里一个成员都没有,简称空类
  • 空类中真的什么都没有吗?并不不是,任何类在什么都不写的情况下,编译器会自动生成6个默认成员函数
  • 默认成员函数:用户没有显式实现,编译器自动生成的成员函数

二、构造函数

1.构造函数的概念

  • 每个类成员变量都需要初始化
  • 这是C语言时期的初始化,自己在类里写初始化函数
  • 但是如果每个类对象在实例化完,都需要去调用初始化函数去进行初始化,就比较繁琐了
  • 此时,能否在类对象创建时,就将数据初始化呢?
  • 然后产生了构造函数
  • 构造函数是一个特殊的成员函数,名字与类名相同,创建类对象时由编译器自动调用它
  • 来保证每个数据成员都有一个自己的初始值,并且在类对象的整个声明周期只调用一次

2.构造函数的特性

  • 构造函数是特殊的成员函数,虽然名字叫构造,但是其主要任务不是构造类,而是初始化对象
  • 其特征如下
  • 1.函数名与类名相同
  • 2.无返回值
  • 3.对象实例化时自动调用对于构造函数
  • 4.构造函数可以重载(重载是后期知识)
  • 构造函数分为无参和有参
  • 为啥调用无参时不带括号呢,因为带了括号就变成函数声明了.......so you know
  • 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦 用户显式定义编译器将不再生成
  • 关于编译器生成的默认成员函数,看起来好像没什么用,也没有对变量进行初始化,变量依旧是随机值
  • 那这里的默认构造函数有啥用呢?
  • 其实 C++把类型分为内置类型也就是(基本类型)和自定义类型,内置类型就是语言本身提供的数据类型,例如int char 等等,自定义类型就是我们使用class/struct/union等自己定义的类型
  • 假设在一个类里面不仅定义了内置类型变量,还定义了一个自定义类型变量,如图
  • 此Time 也是一个class类,用他来定义了一个类对象_t
  • Time类如下图
  • 此时我们在实例化Date类对象的时候,因为我们没写构造函数,所以编译器自动生成且调用了默认构造函数,此时虽然里面的_year _m....变量还是随机值,但是他还会去调用Time类的构造函数去对Time类实例化出的_t对象里的变量进行初始化
  • 所以可以简单理解为,虽然默认构造函数不会对内置类型变量赋值,但是会对自定义类型也进行调用其构造函数,来初始化自定义类型对象
  • 注意:C++11中针对内置类型不初始化的缺陷,又打了补丁:内置类型成员变量可以在类中声明时给默认值
  • 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只有一个
  • 我们没写 编译器默认生成的都可以认为是默认构造函数
  • 简单的说 实例化类对象不需要传参的就是默认构造函数 需要传参的就叫普通构造函数

三、析构函数

1.析构函数的概念

  • 析构函数跟构造函数完全相反,析构函数是销毁对象中的资源
  • 但是不是完成对象本身的销毁,局部对象的销毁是编译器来完成的
  • 在对象销毁时,会自动调用析构函数,完成对象中的资源清理工作

2.析构函数的特性

  • 析构函数是特殊的成员函数,其特征如下
  • 1.析构函数名 是在 类名前面加上~
  • 2.析构函数无形参无返回值
  • 3.一个类只能有一个析构函数,未显式定义,则编译器自动生成默认的
  • 4.析构函数不能重载 只能有一个
  • 5.对象生命周期结束后,C++编译器会自动调用析构函数
  • 注意:如果类中没有申请资源时,可以不写析构,使用默认的即可,但如果有资源申请 例如mallolc或new 则一定要写,否则会导致内存资源泄露

四、拷贝构造函数

1.拷贝构造函数的概念

  • 创建一个跟已存对象相同的新对象
  • 只有一个形参,该形参是对类类型对象的引用(一般都加上const修饰)
  • 编译器自动调用并创建好对象

2.拷贝构造函数的特征

  • 是构造函数的重载形式
  • 拷贝构造形参只有一个,必须是类类型对象的引用,使用传值编译器直接报错,因为会无穷递归拷贝构造下去
  • 若未显式定义,编译器自动生成默认的
  • 默认的拷贝构造函数对象按照内存拷贝方式完成拷贝,这种拷贝叫浅拷贝,也叫值拷贝,不太安全
  • 虽然编译器自己生成的浅拷贝也能实现拷贝,但是如果是涉及到内存空间方面呢?
  • 例如 拷贝出来的类对象 里面的指针变量 指向同一块区域,没有自己单独的区域
  • 此时析构两个对象时,同一块空间被两次释放delete,编译器就会报错
  • 所以我们还是要自己写拷贝,写深拷贝

五、赋值运算符重载

1.运算符重载

  • C++为了代码的可读性 新增了 运算符重载,运算符重载是具有特殊函数名的函数
  • 也具有返回值类型,函数名字以及参数列表

2.赋值运算符重载

  • 参数类型:const T& 引用可以提高效率
  • 返回值类型:T& 传引用返回可以提高效率,有返回值目的是为了连续赋值
  • 检查自己是否要给自己赋值
  • 返回*this
  • 赋值运算符只能重载成类的成员函数,不能重载成全局函数
  • 没显式写则系统默认生成,也是浅拷贝,面对涉及到内存资源时,我们还是要自己写

3.前置++和后置++重载


六、const成员函数

  • 被const修饰的成员函数叫const成员函数
  • 由于this指针是隐藏的,所以我们不用写实参,但是实参如果想加const呢
  • 此时可以这样

七、取地址及const取地址操作符重载

  • 用的很少,了解就行

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

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

相关文章

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期:20241124 学习目标:http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记: 安装requests 安装方式:pip/pip3 install requests 官网教程:Requests: HTTP fo…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下,发现键盘事件里根本就没有{}这两个键。 花费了一下午,终于找到解决的方法了,也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

网络知识1-TCP/IP模型

从用户端到服务端,tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责: 只关注与为用户提供应用功能,如HTTP、FTP、telnet、DNS、SMTP等 ,应用层的职责就像我们寄快递时将快递给快递员…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示,每个矩阵元素代表一个像素,元素的值代表这个位置图像的亮度;其中,彩色图像使用3维矩阵MN3表示;对于图像显示来说,一般使用无符号8位整数来表示图像亮度&…

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述:文本对旋转验证码进行了突破及讲述了实现原理,代码使用纯算法 OpenCV,使用代价较小同时不用安装一大堆AI训练相关的模组,方便且能够快速上手 当前亲自验证了能够支持的网站:国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

JVM:即时编译器,C2 Compiler,堆外内存排查

1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下,其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来; 2.运行环境Matlab2023b及以上,data为数据集,单变量时间序列预测; 3.递归预测未来数据,可以控制预…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键数据在多线程…

最新 Blender 4.2 保姆级安装教程(附安装包)

目录 Blender介绍: Blender下载: Blender改进功能: Blender介绍: Blender是一款开源的跨平台全能三维动画制作软件,提供从建模、渲染、动画、特效、合成到音频处理、视频剪辑等一系列动画短片制作解决方案。它支持…

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…

网络原理(一)—— http

什么是 http http 是一个应用层协议,全称为“超文本传输协议”。 http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0 http3 是…

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…

典型组合逻辑电路设计

目录 行为级描述方式基本运算电路 一、半加器(Half Adder) 二、全加器(Full Adder) 1、逻辑门构成加法器 2、集成全加器 3、串行加法器 4、超前进位加法器 三、全减器(Full Deductor) 数值比较电路 一、一位比较器 二、…