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

news2024/10/5 11:40:20

请添加图片描述

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

🍋类与对象

  • 🍑构造函数(知识点补充)
    • 🍍初始化列表
    • 🍍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++大门了,祝各位好运!!!

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

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

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

相关文章

【前端】使用Web Audio API 技术播放音乐

简言 记录下使用web audio播放音乐的方法。 Web Audio API Web Audio API 提供了在 Web 上控制音频的一个非常有效通用的系统,允许开发者来自选音频源,对音频添加特效,使音频可视化,添加空间效果(如平移&#xff09…

CUDA从入门到放弃(十三):C++语言扩展 C++ Language Extensions

CUDA从入门到放弃(十三):C语言扩展 C Language Extensions 1 Function Execution Space Specifiers 函数执行空间指定符 这些指定符定义函数是在主机还是设备上执行,以及它们是否可以跨平台调用。 1-1 __global__ __global__指…

健身房预约管理系统(源码+文档)

健身房预约管理系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明含有功能:项目截图客户端首页我的预约登录教练预约时间我的注册页个人资料课程预约课程预约 管理端订单管理团课管理教练管理分类管理用户管理 文件包含内容 1、搭建…

[数据结构]排序

本篇主要是对常见排序的分类和一些排序的详解 一、插入排序 1.直接插入排序 // 直接插入排序函数 void insertionSort(int arr[], int n) {int i, key, j;for (i 1; i < n; i) {key arr[i]; // 取出待排序的元素j i - 1;// 将大于key的元素向后移动一位while (j > 0…

6.5 Batch Normalization

在训练神经网络时&#xff0c;往往需要标准化&#xff08;normalization&#xff09;输入数据&#xff0c;使得网络的训练更加快速和有效。 然而SGD&#xff08;随机梯度下降&#xff09;等学习算法会在训练中不断改变网络的参数&#xff0c;隐藏层的激活值的分布会因此发生变…

MySQL故障排查与生产环境优化

一、MySQL单实例常见故障 1.逻辑架构图 MySQL逻辑架构图客户端和连接服务核心服务功能存储引擎层数据存储层 2.故障一 故障现象 ERROR 2002 (HY000): Cant connect to local MySQL server through socket/data/mysql/mysql.sock(2) 问题分析 数据库未启动或者数据库端口…

淘宝优惠券去哪里领取隐藏内部券?

淘宝优惠券去哪里领取隐藏内部券&#xff1f; 1、手机安装「草柴」APP&#xff0c;打开手机淘宝挑选要购买的商品&#xff0c;并点击分享复制链接&#xff1b; 2、将复制的商品链接&#xff0c;粘贴到草柴APP&#xff0c;并点击立即查询该商品的优惠券和约返利&#xff1b; 3、…

java题目15:从键盘输入n个数,求这n个数中的最大数与最小数并输出(MaxAndMin15)

每日小语 你是否有资格摆脱身上的枷锁呢&#xff1f;有许多人一旦获得解放&#xff0c;他的最后一点价值也就会跟着丧失。 ——尼采 自己敲写 它不按我想的来。。。 //从键盘输入n个数&#xff0c;求这n个数中的最大数与最小数并输出 import java.util.Scanner; public clas…

软件测评师教程之软件测试基础

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…

全栈开发与测试定向培养班

Python全栈开发与测试 什么是软件测试&#xff1f; 对于测试行业来说&#xff0c;行业普遍会把职位分为测试工程师和测试开发工程师两个岗位。软件测试工程师就是常规意义上了解到的功能测试岗位&#xff0c;以功能测试为主,会有少量的自动化测试。测试能力要求&#xff1a;熟…

键盘输入与屏幕输出——单个字符的输入和输出

目录 字符常量 字符型变量 单个字符的输入输出 两种输入输出方法的比较 字符常量 字符常量是用单引号括起来的一个符号 *’3’表示一个数字字符&#xff0c;而3则表示一个整数数值 转义字符&#xff08;Escape Character&#xff09; *一些特殊字符&#xff08;无法从键盘…

Dimitra:基于区块链、AI 等前沿技术重塑传统农业

根据 2023 年联合国粮食及农业组织&#xff08;FAO&#xff09;、国际农业发展基金&#xff08;IFAD&#xff09;等组织联合发布的《世界粮食安全和营养状况》报告显示&#xff0c;目前全球约有 7.35 亿饥饿人口&#xff0c;远高于 2019 年的 6.13 亿&#xff0c;这意味着农业仍…

【Linux C | 多线程编程】线程的连接、分离,资源销毁情况

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-04-01 1…

讲解pwngdb的用法,以csapp的bomb lab phase_1为例

参考资料 Guide to Faster, Less Frustrating Debugging 什么情况下会使用gbd 需要逆向ELF文件时(掌握gdb的使用&#xff0c;是二进制安全的基本功)开发程序时&#xff0c;程序执行结果不符合预期 动态调试ELF文件可以使用另外一种方法&#xff1a;IDA的远程linux动态调试。个…

探索 Redis 数据库:一款高性能的内存键值存储系统

目录 引言 一、非关系型数据库 &#xff08;一&#xff09;什么是非关系型数据库 &#xff08;二&#xff09;非关系型数据库的主要特征 &#xff08;三&#xff09;关系数据库与非关系型数据库的区别 二、Redis 简介 &#xff08;一&#xff09;基本信息 &#xff08;…

栈————顺序栈和链式栈

目录 栈 顺序栈 1、初始化顺序栈 2、判栈空 3、进栈 4、出栈 5、读栈顶元素 6、遍历 链式栈 1、初始化链式栈 2、断链式栈是否为空判 3、入栈(插入) ​编辑​编辑 4、出栈(删除) 5、读取栈顶元素 6、输出链式栈中各个节点的值&#xff08;遍历&#xff09; 栈 …

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;从左下角或者右上角元素出发&#xff0c;来寻找target。解题思路二&#xff1a;右上角元素&#xff0c;代码解题思路三&#xff1a;暴力也能过解题思路四&#xff1a;二分…

【小呆的力学笔记】弹塑性力学的初步认知六:后继屈服条件

文章目录 4. 后继屈服条件4.1 后继屈服条件4.2 强化模型4.2.1 等向强化模型4.2.2 随动强化模型4.2.3 两种强化模型的讨论 4. 后继屈服条件 4.1 后继屈服条件 上一章节的屈服条件是在当材料未经受任何塑性变形时且在载荷作用下材料第一次进入屈服应该满足的条件&#xff08;也…

Vscode + PlatformIO + Arduino 搭建EPS32开发环境

Vscode PlatformIO Arduino 搭建EPS32开发环境 文章目录 Vscode PlatformIO Arduino 搭建EPS32开发环境1. Vscode插件安装2. 使用PlatformIO新建工程3.工程文件的基本结构4.一个基本的测试用例Reference 1. Vscode插件安装 如何下载vscode这里不再赘述&#xff0c;完成基本…