C++ 类和对象 3

构造函数扩展

构造函数体内的赋值:构造函数一般是用于类对象的初始化的,但严谨来说并不是成员变量的初始化,内置类型的初始化是在生成的同时赋值而且仅有一次,但是在构造函数体内是能对成员变量进行多次赋值的。所以在函数体内的仅是赋值而不是初始化。

成员变量的初始化:在C++中有一些变量是只能使用初始化来赋值的,初始化之后改变量是无法被再次赋值的,这些变量就无法在构造函数体内完成赋值所以构造函数针对这些变量还有一个初始化列表。

这是一个完整的初始化列表的构造函数,这个构造函数的函数体是空的什么都没有完全依靠初始化列表完成对成员变量的初始化,列表的开始用:后面每一个成员用逗号隔开,列表中每个成员变量只能出现一次,类似变量的引用,const变量,自定义类型成员且没有默认构造函数的这类只能初始化的变量便可以使用初始化列表来初始化。

一般构造函数中能使用初始化列表初始化的都会尽量使用初始化列表,当然像需要有额外操作如开辟空间之类的也是可以在函数体中实现,构造函数会先走初始化列表然后再进入函数体,注意初始化列表的初始化顺序与我们写的初始化列表的成员变量的顺序无关而是按照在类中声明的顺序初始化的

这里我定义的顺序是_a->_b->_c那么只要包含这三个成员变量就肯定按照这个顺序初始化,无关初始化列表的顺序。

explicit关键字

内置类型中是存在隐式类型转化的在相近类型之间进行赋值的时候会通过隐式类型转化生成一个目标类型的中间变量再完成赋值,自定义类型当我们有全缺省构造函数或者除了一个参数没有默认值其余都有的构造函数或只有一个参数的构造函数的时候就可以发生赋值时的隐式类型转化,

这里我实现了一个单参数的构造函数当我用一个符合上面函数的值创建这个类对象的时候便会发生隐式类型转化同过这个构造函数创建一个_a为0的临时对象再调用赋值运算符重载来完成这次的自定义类型的赋值。

可是当我们使用隐式类型转化来创建新对象的时候其一这个代码的可读性就不太好,C++是从C中拓展而来的这种类型相差如此大的变量类型能如此不符合C语言的习惯,同时效率上是有缺失的,这里先是构造了一个临时对象再进行赋值构造而我们可以直接构造的不需要走第二次的赋值构造的,若是一些构造有些消耗的都会些效率上的损失。

那么我们这里在声明这个构造函数的时候就可以加上explicit关键字

这样子就限定了不能进行隐式类型转化也就杜绝了这种代码的出现

static成员

通过static修饰的变量和函数会存放在静态区,并且其相当于全局的,拥有和全局变量和函数一样的作用域和生命周期。

若是我们在类中声明了静态成员与一般变量函数一样也是存放在静态区的,并且是类中静态成员函数是没有this指针的所以也不能调用类中的非静态成员函数和非静态变量,静态成员变量还不能在类中定义只能在外部定义,类中只能对静态成员变量进行声明,在进行声明时不需要加static修饰。

类中的静态成员是被所有类对象所公有的,无论存在多少个类对象,静态成员都仅有一份,每个对象访问的都是同一个静态成员。

友元

类使用划分公有,私有,保护来让类获得封装的特性,但可能会有特定的函数或者类需要访问这些隐藏的数据或函数的情况,这里C++就为这种情况设计出了友元的概念,我们可以将函数或者其他类设置成某一个类的友元函数或者友元类,这个函数或者类就可以如同成员函数一样访问类中的所有成员。

友元函数

在C++中我们打印到屏幕和从键盘中提取数据一般使用cout<<和cin>>的方式,但是输入输出流对象函数相应第一个参数分别是ostream和istream的类对象,但是在类中每个函数都规定第一个参数是隐含的this指针作为参数,所以在类中实现便行不通,但是我们进行输出和输入都肯定需要访问类中的成员变量的,而一般的成员变量都是私有或者保护的,所以我们只能使用友元函数的方式,在外部实现流插入操作符和流提取操作符的重载,在类型声明成友元。

这是对流插入的重载我在外面实现在类中进行友元的声明即声明加friend,这样这个函数便能通过对象名字来完成对私有和保护成员的访问了。

友元函数是不受类作用域的限制的,友元函数能在任何地方实现,并通过对象完成对对象内部所有成员的访问,但是友元函数不能使用const修饰。

友元类

友元类与函数的声明相似,以上面类为例,若要将Add这个类声明为其他类的友元类只需要在类的任意地方加上“friend class Add”即可。

声明完之后那么我的Add的所有函数就自动成为这个类的友元函数可以访问这个类的所有成员。友元是单向的Add类可以访问这个类的所有成员但是这个函数并不能访问Add类的私有保护成员。

友元关系不能传递,A是B的友元,B是C的友元并不代表A是C的友元。即朋友的朋友并不是朋友。

友元不能继承,若A是B的友元,C继承B,A也不是C的友元。

内部类

我们可以在一个类内部再定义一个类,这个再定义的类就是内部类。内部类天生是外部类的友元类,但是调用外部类的static成员时并不需要添加类名或者对象名。

外部类对内部类的访问权限是没有改变的,就如一般从外部访问类的对象一样,不可访问私有保护,只能访问公有成员。当我们用sizeof()对外部类计算大小时是不计算内部类的。

类的总结

类是一个抽象的概念,在计算机的世界没有复杂的定义只有二进制,但是人类是可以进行抽象的联想的。所以就有了类,类就如同是人与计算机的一种交流规则,人的抽象思想定义一个类,通过细节的实现完成类被计算机去理解(这里还需要经过编译器的翻译)。这样我们就可以复用这个类而让人与计算机的交流变得更为高效。

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

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

相关文章

探索OpenCV:图像处理基础与实践

探索OpenCV&#xff1a;图像处理基础与实践 前言图像读取基础安装OpenCV库读取彩色与灰度图像 RGB颜色模型颜色通道解析单通道图像显示 感兴趣区域&#xff08;ROI&#xff09;图像处理进阶技巧图像打码图像组合图像缩放 结语 前言 在当今数字化时代&#xff0c;图像不仅是我们…

详谈进程等待

目录 前言1. 进程等待的必要性1.1 进程等待的定义 2. 如何进行进程等待2.1 wait 单进程2.2 wait 多进程2.3 status && 退出情况2.3.1 status 参数构成2.3.2 简证 status 参数构成2.3.3 进程等待失败2.3.4 宏调用查看退出信息 3. 进程等待的原理 前言 本篇文章继上一篇…

Hive SQL

一、基本数据类型 tinyint 1byte 有符号整数 smallint 2byte 有符号整数 int 4byte 有符号整数 bigint 8byte 有符号整数 boolean 布尔类型&#xff0c;true或者false float 单精度浮点数 double 双精度浮点数 decim…

C语言07---指针进阶

指针万能拆解法 char型指针 char型指针实质上跟别的类型的指针并无本质区别&#xff0c;但由于C语言中的字符串以字符数组的方式存储&#xff0c;而数组在大多数场合又会表现为指针&#xff0c;因此字符串在绝大多数场合就表现为char型指针。 定义&#xff1a; char *p &qu…

区块链国赛第六套样题(关于运维)

任务1-2&#xff1a;区块链系统部署与运维 围绕食品安全溯源区块链平台部署与运维需求&#xff0c;进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范&#xff0c;完成系统日志、网络参数、节点服务等系统结构的维…

Hadoop的HA配置与实现(ZooKeeper)

目录 一、Hadoop的HA架构二、配置实现Hadoop的HA三、效果 一、Hadoop的HA架构 集群规划 112&#xff1a;NameNode1 ResourceManager1 JournalNode1 113&#xff1a;NameNode2 ResourceManager2 JournalNode2 114&#xff1a;DataNode1 NodeManager1 115&#xff1a;DataNode2 N…

linux 云主机下载 rpm 包安装 oracle java jdk21 实录(华为云 EulerOS)

本来是想通过 yum install 相关的 openjdk 版本的, 但老是提示说找不到, 也不想去配置相关的仓库了, 所以改成去 oracle 官网下载 jdk21 的 rpm 包来安装. 云主机是华为云的 EulerOS , 具体为 Huawei Cloud EulerOS 2.0 标准版 64位(公共镜像), 相对于用的比较熟 centos, 差别…

学习之在window上安装MySQL server 并连接到Navicat

一、下载 下载地址&#xff1a;https://www.mysql.com/ 二、安装 1、双击软件安装2、点击yes

云计算实训36——mysql镜像管理、同步容器和宿主机时间、在容器外执行容器内命令、容器的ip地址不稳定问题、基础镜像的制作、镜像应用

一、线上考试系统的数据虚拟化技术部署 1.部署前段服务器 步骤一&#xff1a;将资源上传到服务器 将dist.zip上传给服务器 下载unzip的包 yum -y install unzip 解压 unzip dist.zip 步骤二&#xff1a;创建基础容器在服务器上 启动服务 systemctl start docker.servic…

用 Go 语言实现常见的十大排序算法(上)

十大常见的排序算法有&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09; 选择排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insertion Sort&#xff09; 希尔排序&#xff08;Shell Sort&#xff09; 归并排序&#xff08;Merge Sort&#xf…

<数据集>考场行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2192张 标注数量(xml文件个数)&#xff1a;2192 标注数量(txt文件个数)&#xff1a;2192 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cheating, good] 序号类别名称图片数框数1cheating128214412good1067…

气膜建筑与装配式建筑的对比分析—轻空间

在现代建筑中&#xff0c;气膜建筑和装配式建筑都作为新型建筑形式受到关注。然而&#xff0c;在很多应用场景中&#xff0c;气膜建筑展现出了比装配式建筑更为明显的优势。以下将着重对比气膜建筑相较于装配式建筑的独特优势。 气膜建筑的突出优势 1. 更快的施工速度 气膜建筑…

在 Debian 上安装 IntelliJ IDEA 笔记

在 Debian&#x1f4a9; 上安装 IntelliJ IDEA &#x1f4a1; 笔记 下载安装 JDK17安装 IntelliJ IDEA Community添加桌面启动项&#xff08;快捷方式&#xff09; 参考资料 下载 两个包已经下好了&#xff0c;一个JDK17&#xff0c;一个IntelliJ IDEA Community 使用 wget ur…

微信对话开放平台接口源码分享

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 接口源码 📒⚓️ 相关链接 ⚓️📖 介绍 📖 微信对话开放平台是微信官方授权的智能对话技术平台,旨在帮助开发者及非开发者快速搭建智能对话机器人(智能客服),并轻松接入微信公众号、小程序、企业微信等微信生态中的各…

netty编程之UDP

写在前面 源码 。 UDP&#xff0c;user datagram protocol,是internet协议簇中无连接的传输协议&#xff0c;因为无连接所以相比于TCP需要维护更少的信息以及网络交互&#xff0c;所以具有更高的效率。本文看下netty是如何实现的&#xff0c;和TCP方式差别不大&#xff0c;下面…

自动化作业批改系统的实现以及代码分析

作者主页: 知孤云出岫 目录 作者主页:1. 系统需求分析1.1 功能需求1.2 性能要求 2. 系统设计2.1 模块化设计2.2 数据库设计2.3 系统接口设计 3. 具体技术实现3.1 题目解析模块3.2 答案匹配模块3.3 评分模块3.4 反馈生成模块3.5 系统集成 1. 系统需求分析 在构建一个自动化的…

【数学分析笔记】第2章第4节收敛准则(4)

2.数列极限 2.4 收敛准则 上节课举了一个例子 a N 1 1 2 p 1 3 p . . . 1 n p a_{N}1\frac{1}{2^{p}}\frac{1}{3^{p}}...\frac{1}{n^{p}} aN​12p1​3p1​...np1​ p > 1 p>1 p>1&#xff0c; { a n } \{a_{n}\} {an​}收敛 0 < p ≤ 1 0<p\le 1 0<p≤…

ET6框架(一)介绍及环境部署

文章目录 一、什么是ET框架&#xff1f;二、ET框架特色&#xff1a;三、开发环境准备&#xff1a;四、.Net Core下载安装五、安装Visual Studio六、下载Mongodb七.安装Robo 3T八、下载ET版本分支 一、什么是ET框架&#xff1f; 1.ET(客户端&#xff0c;服务器端)是一个开源的双…

《机器学习》 决策树 ID3算法

目录 一、什么是决策树&#xff1f; 1、概念 2、优缺点 3、核心 4、需要考虑的问题 二、决策树分类标准&#xff0c;ID3算法 1、什么是ID3 算法 2、ID3算法怎么用 1&#xff09;熵值计算公式 2&#xff09;用法实例 三、实操 ID3算法 1&#xff09;求出play标签的熵…

欧姆龙PLC数据 转 IEC61850项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 网关采集欧姆龙PLC数据 5 用IEC61850协议转发数据 6 网关使用多个逻辑设备和逻辑节点的方法 7 案例总结 1 案例说明 设置网关采集欧姆龙PLC数据把采集的数据转成IEC61850协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX…