【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++大门了,祝各位好运!!!

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

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

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

相关文章

ESP32学习---ESP-NOW

ESP32学习---ESP-NOW 基于Arduino IDE环境获取mac地址单播通讯一对多通讯多对一通讯多对多通讯模块1代码模块2模块3 广播通讯 基于ESP-IDF框架 乐鑫编程指南中关于ESP-NOW的介绍:https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.1/esp32/api-reference/net…

7.1 Mysql shell 定时备份

直接上脚本----linu 定时任务执行 #!/bin/bash# 配置信息 DB_USER"your_username" # 数据库用户名 DB_PASSWORD"your_password" # 数据库密码 DB_NAME"your_database_name" # 要备份的数据库名 BACKUP_DIR"/path/to/backup/directory"…

深度学习训练中的种子设置

文章目录 深度学习训练中的种子设置1. 为什么需要设置随机种子2. 随机种子的设置及使用 深度学习训练中的种子设置 1. 为什么需要设置随机种子 在神经网络训练过程中,经常会通过随机的方式对一些数据进行初始化: 1、随机权重,网络有些部分…

C语言--实现判断输入数字是几位数的函数

用起来很方便&#xff0c;代码如下 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int digit (int x){int count 0;do {count;x x / 10;} while (x > 0); return count;} int main() {int x 0;scanf("%d", &x);int number digit(x);printf…

如何在Ubuntu系统部署Z-blog博客结合cpolar实现无公网IP访问本地网站

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗 Mac玩游戏 crossover24免费激活

CrossOver是一款可以在macOS上运行Windows应用程序的软件&#xff0c;它利用了Wine技术&#xff0c;无需安装虚拟机或双系统&#xff0c;可以直接在苹果系统下运行Windows游戏。那么&#xff0c;使用CrossOver玩游戏会损害电脑吗&#xff1f;CrossOver玩游戏会卡吗&#xff1f;…

LLaMA-Factory参数的解答

打开LLaMA-Factory的web页面会有一堆参数 &#xff0c;但不知道怎么选&#xff0c;选哪个&#xff0c;这个文章详细解读一下&#xff0c;每个参数到底是什么含义这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数不对请反馈一下&#xff0c;或者有补充的…

【软件测试】教程及案例

软件测试是软件开发过程中的关键环节&#xff0c;它确保软件产品符合设计要求并且能够在各种条件下正常运行。以下是关于软件测试的教程和案例的详细介绍&#xff1a; ### 软件测试基础 软件测试的目的是发现和修复软件中的缺陷&#xff0c;以确保软件的质量。测试可以在软件…

面试题(六)

目录 101.RocketMQ的事务消息是如何实现的 102.为什么RocketMQ不使⽤Zookeeper作为注册中⼼呢&#xff1f; 103.RocketMQ的实现原理 104.RocketMQ为什么速度快 105.消息队列如何保证消息可靠传输 106.消息队列有哪些作⽤ 107.死信队列是什么&#xff1f;延时队列是什么&a…

【Entity Framework】EF中的增删改查

【Entity Framework】EF中的增删改查 文章目录 【Entity Framework】EF中的增删改查一、概述二、DbContext数据上下文三、EntityState五个状态值四、EF添加数据4.1 EF Add方式4.2 EF 通过改变对象的状态为 Added4.3 调用方sql4.4 调用存储过程 五、EF修改数据5.1 不查询数据库&…

Pytorch:Pytorch入门基础

文章目录 一、PyTorch概述二、Pytorch基础数据结构三、Tensorflow和Pytorch的区别TensorFlow和PyTorch的区别 四、导入Pytorch库 学习参考于&#xff1a; 与凤行——上古神君&#xff1a;Pytorch数据结构 一、PyTorch概述 PyTorch是一个开源的机器学习库&#xff0c;用于计算…

项目管理系统在制造业的应用,提高生产效率的秘诀与解决方案

缩短产品交货周期&#xff0c;提高产品交付率是当下很多制造业面临的难题&#xff0c;项目管理系统业务流程自动化&#xff0c;能够显著改善项目效率。接下来我们说一说项目管理系统在制造业的应用&#xff0c;项目管理系统制造业解决方案。 制造业典型的项目背景 随着企业体量…

学习【Redis原理篇】这一篇就够了

目录 1. 数据结构1-1. 动态字符串&#xff08;SDS&#xff09;1-2. intset1-3. Dict 2. 网络模型3. 通信协议4. 内存策略 1. 数据结构 1-1. 动态字符串&#xff08;SDS&#xff09; 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字…

【Java项目】基于SpringBoot的【就业信息管理系统】

在当今这个科技迅猛发展的时代&#xff0c;计算机技术在生活中扮演着至关重要的角色&#xff0c;特别是在信息管理领域。在这样的背景下&#xff0c;学习计算机知识不只是简单地掌握一项技能&#xff0c;更关键的是将所学知识应用于实际&#xff0c;以创新的思维不断简化人们的…

JAVA 100道题(24)

24.使用Java的线程池&#xff08;ExecutorService&#xff09;执行一组任务。 在Java中&#xff0c;ExecutorService是一个用于管理和控制线程的工具&#xff0c;它允许你提交任务给线程池来异步执行。下面是一个使用ExecutorService来执行一组任务的简单示例&#xff1a; java…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。…

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

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

8.6 循环神经网络的简洁实现

每个步长共用参数 加载数据 虽然 8.5节 对了解循环神经网络的实现方式具有指导意义&#xff0c;但并不方便。 本节将展示如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from…

#include<初见C语言之指针(5)>

目录 一、sizeof和strlen的对比 1. sizeof 2.strlen 二、数组和指针题解析 1. ⼀维数组 1.1数组名理解 2.字符数组 3. ⼆维数组 三、指针运算题解析 总结 一、sizeof和strlen的对比 1. sizeof 我们前面介绍过sizeof是单目操作符 sizeof括号中有表达式&#xff0c;不…

解决PATH变量污染的问题

文章目录 解决PATH变量污染的问题概述笔记清空PATH变量之后的系统设置在命令行查看清空后的PATH变量以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例以系统命令 where为例run_vs2019.bat备注 - 批处理的后缀最好是batEND 解决PATH变量污染的问题 概述 随着不断安装新软件,…