【c++初阶】类与对象(下)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋类与对象

  • 🍑构造函数(知识点补充)
    • 🍍初始化列表
    • 🍍explicit关键字
  • 🍑static成员
    • 🍍概念
    • 🍍特性
  • 🍑友元
    • 🍍友元函数
    • 🍍友元类
  • 🍑内部类
    • 🍍概念
    • 🍍特性
  • 🍑类与对象的理解

🍑构造函数(知识点补充)

上篇已经讲到了构造函数的大部分知识点,在这里有几个新知识点需要大家了解。

🍍初始化列表

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

我们已经知道了默认构造函数:

在这里插入图片描述

上篇中已经讲到,全缺省构造函数也是属于默认构造函数。

初始化列表也是与构造函数有关:

在这里插入图片描述
上图就是初始化列表的写法,初始化列表主要是在构造函数中实现。

大家注意书写格式。

平常的我们在函数体内初始化,那叫函数体初始化。两者各有各的优点和缺点。

引用和const和自定义类型没有构造函数时等修饰需要在初始化列表定义,不能在函数体内定义。两种写法可以混着使用,符合规则即可。

总结:

  1. 必须有定义的地方显示初始化“引用、const、没有默认构造的自定义成员类型”。
  2. 有些自定义成员想要显示初始化,可以自己控制。
  3. 初始化列表初始化的顺序是按声明顺序走的。

🍍explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

大家应该都知道类型转换,平常的类型转换我们都看到,比如:

int a = 1;
float c = (float)a;

c是float类型,a是int类型,而当我们需要把a的值赋给c时,就需要先把a转换成float类型,然后再传给c。

再看看这个程序:
在这里插入图片描述
在这个程序当中,我没有给a进行类型转换,就已经传给c了,并且运行成功了。这是为什么呢? 这是因为在系统内部进行了隐式类型转换,实际上在a传过去的那一刻,a已经是float类型了,我们看不到。

explicit关键字它的功能也与这隐式转换有关,不过它是起限制隐式转换的作用。

接下来看这个代码:

在这里插入图片描述
大家应该很疑惑,为什么100可以直接赋给Add类的vv,100是int类型,而vv是Add类型,并且是一个类。其实在这里是进行了隐式转换。

如:在这里插入图片描述
从100赋给vv是分为两步,第一步就是构造,然后中间有一个Add类的临时变量来接受100,此时100就从int类型到Add类型的转换,第二步就是拷贝构造,临时变量把100传给了vv。

大家可以看看显示转换的写法:

//第一种写法
Add vv = Add(100);
//第二种写法
Add vv(100);

上面就是显示转换的写法。

在这里插入图片描述
加了explicit后,就会报错,explicit限制了隐式类型的转换。

在这里插入图片描述
显示转换没有收到影响。

用explicit修饰构造函数,将会禁止构造函数的隐式转换。

🍑static成员

🍍概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。

静态成员有一个显著的特点,那就是它们不属于某一个特定的对象,而是属于整个类,也就是说,无论创建了多少个类的对象,这些对象都共享同一个静态成员。因此,静态成员可以被视为连接各个对象的桥梁。

当然还有一点,静态成员变量一定要在类外进行初始化。

🍍特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

🍑友元

友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,并在说明时前面加上关键字“friend”,以区别于该类的成员函数。尽管友元不是类的一部分,但它可以访问类中的私有成员,从而打破了类的封装性和隐藏性。这种设计的目的通常是为了提高程序的运行效率,减少类型和安全性检查及调用的时间开销。

友元分为友元函数和友元类。

🍍友元函数

  1. 友元函数可以直接访问类的私有成员。
  2. 它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

注意

  1. 友元函数可访问类的私有和保护成员,但不是类的成员函数
  2. 友元函数不能用const修饰
  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  4. 一个函数可以是多个类的友元函数
  5. 友元函数的调用与普通函数的调用原理相同

🍍友元类

友元类是一种特殊的类关系,在C++中定义,它允许一个类(友元类)访问另一个类(宿主类)的私有成员(包括私有成员变量和私有成员函数)。当一个类作为另一个类的友元时,这意味着这个类的所有成员函数都是另一个类的友元函数,可以访问另一个类中的隐藏信息。

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

  1. 单向性:友元关系是单向的,不具有交换性。即,如果类B是类A的友元,类A不一定是类B的友元。这是因为在类中是否有相应的声明决定的。
  2. 非传递性:友元关系也不具有传递性。即,如果类B是类A的友元,类C是类B的友元,类C不一定是类A的友元。这同样取决于类中是否有相应的声明。
  3. 访问权限:友元类可以访问宿主类的所有成员,包括私有成员和保护成员,而不受类的访问限定符限制。
  4. 声明位置:友元的声明通常放在类的定义中,位于public、protected和private之外。

🍑内部类

🍍概念

在C++中,内部类(也称为嵌套类)是定义在另一个类的作用域内的类。内部类可以是另一个类的成员,也可以定义在另一个类的函数或作用域块中。

内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

🍍特性

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。

如:在这里插入图片描述

B天生就是A的友元,但A不是B的友元。

🍑类与对象的理解

现实生活中的实体计算机并不认识,计算机只认识二进制格式的数据。如果想要让计算机认识现
实生活中的实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以认识。比如想要让计算机认识洗衣机,就需要:

  1. 用户先要对现实中洗衣机实体进行抽象—即在人为思想层面对洗衣机进行认识,洗衣机有什么属性,有那些功能,即对洗衣机进行抽象认知的一个过程
  2. 经过1之后,在人的头脑中已经对洗衣机有了一个清醒的认识,只不过此时计算机还不清楚,想要让计算机识别人想象中的洗衣机,就需要人通过某种面相对象的语言(比如:C++、Java、Python等)将洗衣机用类来进行描述,并输入到计算机中
  3. 经过2之后,在计算机中就有了一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能洗衣机是什么东西。
  4. 用户就可以借助计算机中洗衣机对象,来模拟现实中的洗衣机实体了。在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。

类与对象就在此结束了,接下来就算正式踏入C++大门了,祝各位好运!!!

请添加图片描述
请添加图片描述

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

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

相关文章

SAP Fiori开发中的JavaScript基础知识6 - 数组(Arrays)

1 背景 在本篇博客中,我将介绍JavaScript中数组(Arrays)的概念和用法。 2 数组 在JavaScript中,数组是一种特殊的对象,用于存储多个值在单个变量中。 2.1 创建数组 在JavaScript中,创建数组有以下有2种…

引用,内联函数,auto函数,指针nullptr

一:引用 1.1 该文章的引用是对上一篇引用的进行补充和完善 按理来说,double可以隐式转换为int,那起别名的时候为什么不可以类型转换呢? 那是因为,在类型转换的时候,会创建一个临时变量,让后再…

基于8086毫秒数码管计时器仿真设计

**单片机设计介绍,基于8086毫秒数码管计时器仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086毫秒数码管计时器仿真设计概要主要关注于利用8086微处理器实现毫秒级别的计时功能,并通过数码管显示时间…

CentOS7安装DockerCompose

1.CentOS7安装DockerCompose 1.1.下载 Linux下需要通过命令下载: # 安装 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose1.2.修改文件权限 修改文件权限&#xff1a…

Linux安装软件每次靠百度,这次花了些时间,终于算是搞明白了

Linux下安装命令虽然经常使用,但也仅仅是会使用,每次再用时依然的百度 。于是就花了些时间整体的梳理了一番,以便于更好的理解。 1.安装流程介绍 在Linux下安装软件,其实也是遵循着和Windows一样的安装流程。 首先,…

商城业务-检索服务

文章目录 前言一、搭建页面环境1.1 静态界面搭建1.2 Nginx 动静分离1.3 Windows 上传文件1.4 引入 thymeleaf 依赖1.5 Nginx 反向代理1.4 Nginx 配置1.5 gateway 网关配置 二、调整页面跳转2.1 引入依赖2.2 页面跳转 三、检索查询参数模型分析抽取3.1 检索业务分析3.2 检索语句…

【Spring源码分析】透过源码看透Spring事务

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入(一)【Spring源码分析】…

Java程序运行的问题——异常

什么是异常? Java程序在运行时出现的问题就叫异常 jdk中将异常一新封装成了一个个的类,当出现问题时,就会创建异常对象,抛出异常信息(问题原因、位置) 1.异常 1.1的继承体系 Throwable 是所有错误(erro…

关于OpenFeign的返回类型包装问题

在一天夜里。我在使用feign的调用时,突然出现了一点点问题。 就是对于feign类型的包装问题。产生了疑问。 在后来,也就是今天。在网上取取经。看到了一个答案。说:feign的调用会有一个编码器和解码器。 使用feign的解码器。他的原理也很简…

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式 基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话, 还能根据聊天的上下文进行互动&…

热门IT【视频教程】-华为/思科/红帽/oracle

华为认证 网络工程师-入门基础课:华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课:华为HCIP认证课程介绍-CSDN博客 职场进阶,踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 : 超级实用,华为VRP系统文件…

4核8G服务器租用优惠价格418元一年,可买3年

京东云4C8G云服务器优惠价格418元1年、1899元三年,配置为:轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量,京东云主机优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单,活动打开如下图: 京东…

【Go】十四、封装、继承

文章目录 1、封装2、继承3、继承的注意点 1、封装 隐藏实现细节保证数据安全(控制变量或方法的访问范围,private) Go中实现封装: 结构体、字段的首字母小写(Java的private)提供一个工厂模式函数&#xf…

SpringBoot+uniApp宠物领养小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.保存宠物信息代码2.提交订单信息代码3.查询评论信息代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootuniApp框架开发的宠物领养微信小程序系统。…

数据可视化-ECharts Html项目实战(9)

在之前的文章中,我们学习了如何在ECharts中编写气泡图,词云图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 数据可视化-ECharts Ht…

vue 文件下载

1.返回路径下载 注: 针对一些浏览器无法识别的文件格式(如pdf、xls、ppt)。可以直接在地址栏上输入URL即可触发浏览器的下载功能。 情况1 //地址栏输入文件URLwindow.location.href URLwindow.open(URL) 注:该方式将下载逻辑放在后端处理&#xff0c…

面试时如何回答接口测试怎么进行

一、什么是接口测试 接口测试顾名思义就是对测试系统组件间接口的一种测试,接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 …

权限提升-Linux系统权限提升篇VulnhubCapability能力LD_Preload加载数据库等

知识点 1、Web或用户到Linux-数据库类型 2、Web或用户到Linux-Capability能力 3、普通用户到Linux-LD_Preload加载so配合sudo 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学习权限…

Python接口自动化 —— 什么是接口测试、为什么要做接口测试?

简介 上一篇和大家一起科普扫盲接口后,知道什么是接口,接口类型等,对其有了大致了解之后,我们就回到主题-接口测试。 什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各…

C语言-冒泡排序算法

题目描述 设计一个程序,实现冒泡排序算法,并输出{9,8,7,6,5,4,3,2,1,0} 的排序过程。 输出 每个排序过程输出一行,直到排序完成。 样例输出 Expected 9 8 7 6 5 4 3 2 1 0 0 9 8 7 6 5 4 3 2 1 0 1 9 …