[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
- 一.static 成员:
- 1.概念引入:
- 1-1:定义全局变量记录个数?
- 2.如果有多个类需要分开去记录类对象的个数?
- 2-1:可不可以声明成员变量解决?
- 2-2:使用static成员变量:
- 1.概念:
- 2.静态成员函数:
- 3:优点:
- 3.总结:
- 4.一个题目:
- 思路一:
- 两个问题:
- 二.explicit:
- 1.概念引入:
- 2.概念提升:
- 支持?
- 没有缺省值?
- 3.explicit的作用?
- 1,概念:
- 2.使用:
- 三.友元:
- 1.友元函数:
- 总结:
- 2.友元类:
- 1.概念:
- 四:内部类:
- 1. 概念:
- 2. 特性:
- 3.应用:
- 思路二:
- 五:拷贝构造时的优化:
- 1.概念:
- 2.引入:
- 情景一:
- 1.问题?
- 情景二:
- 情景三:
- 情景四:
一.static 成员:
1.概念引入:
1-1:定义全局变量记录个数?
1.我们首先想到的方法是定义一个全局的变量去记录创建类对象的个数,我们定义一个count去在对象构造的时候进行++。
2.经过下面的图片可以看到在全局count被多次定义所以我们可以通过命名空间把count这个全局给封装一下!
2.如果有多个类需要分开去记录类对象的个数?
2-1:可不可以声明成员变量解决?
我们可以声明一个成员变量去在构造的过程中去记录个数创建类对象的个i数?
答:是不可以的,因为每一个成员变量都被分配了一个空间。不可能产生去记录个数的作用!
2-2:使用static成员变量:
1.概念:
1.static成员变量是声明在类中的,是在全局初始化(定义)的。
2.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2.我们想要获得在类里面声明的_count ,可以解除类域和访问限定符的限制做到可以直接打印个数构造的个数:
3.我们加上一个域和访问限定都是防止外面可以随便访问类的成员进行随意的修改,所以这里可以考虑使用类的成员函数去获取通过类和访问限定修饰的_count。
4.正常寻找数据是向上寻找,在当前函数域中找再到全局中去找,如果不加域访问限定符,正常是不会到类中寻找。这也是命名空间存在的意义!
1.使用用类的成员函数我们是需要一个类的对象的,不然调用不到这个成员函数:
2.匿名代码优化:
2.静态成员函数:
1.我们上面的操作都是通过创建一个对象去通过创的对象进行函数的调用获取个数并且还需要减去1.因为多创建了一个对象用来计数。
2.静态成员函数是没有指针的,只需要进入类域就可以访问到静态成员函数。这个时候静态成员函数是全局的函数但是被这个类所占有需要通过域访问限定符进行访问
3.静态成员函数不可以访问非静态的成员变量因为静态成员函数是没有this指针的!
3:优点:
通过静态成员函数和静态成员变量,可以在完美的计算个数的同时不会影响类原来的任何操作。
3.总结:
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
- 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
- 静态成员也是类的成员,受public、protected、private 访问限定符的限制
6.静态成员函数和静态成员变量本质都是全局的只是受到类的限制。
4.一个题目:
题目链接
思路一:
我们看一下这个题目基本上所有通过运算的方法都被限制完全了没有什么方法可以解决了,但是我们经过上面的学习是不是可以通过构造N次去模拟实现循环N次再通过静态成员函数和静态成员变量解决这个问题呢?
class A{
public:A(){_sum+=_i;_i++;}static int Get_Sum(){return _sum;}
private:static int _i;static int _sum;
};int A::_i=1;
int A::_sum=0;class Solution {
public:int Sum_Solution(int n) {A arr[n];return A::Get_Sum(); }
};
两个问题:
-
静态成员函数可以调用非静态成员函数吗?
答:不可以: 静态成员函数没有this指针不可以调用非静态成员函数并且不可以调用非静态成员变量。 -
非静态成员函数可以调用类的静态成员函数吗?
答:可以 :静态成员函数只是收到类域的限制我们想要使用静态成员函数需要指定类域。
二.explicit:
1.概念引入:
我们观察上面的代码,为什么发生隐式类型转换呢?
答:关于内置类型不相同的之间可以发生隐式类型转换。我们这里是内置类型和自定义类型之间发生的隐式类型转换。是因为有单参数的构造函数支持发生了隐式类型的转换!
2.概念提升:
既然存在支持单参数的构造函数那么存不存在支持多参数的构造函数呢?
支持?
我们发现其实是支持多参数的隐式类型转换,但是我们month和day都有缺省值在这个地方本质还是一个单构造函数支持的隐式类型转换!
没有缺省值?
C++11 支持进行列表初始化!
3.explicit的作用?
1,概念:
1.使用:加在构造函数函数名之前可以阻止上面的这个隐式类型转换的发生!
2.作用:使用explicit相当于把这个构造函数给标记为了显示的构造函数这个构造函数就不会支持隐式类型的转换了
3.强制类型转换是管不了的!
2.使用:
通过模板创建了一个Date类型的一个链表,调用push_back 函数。三个方法可以进行尾插!
1.方法一:正常创建一个对象去进行插入。
2.方法二:通过匿名对象进行插入。
3.方法三:通过隐式类型转换支持的一个尾插数据:
4.在大多数情况下都是允许隐式类型转换的发生的,在少部分情况下不允许隐式类型转换发生的!
三.友元:
1.友元函数:
问题:现在尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置 this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理。
总结:
友元函数可访问类的私有和保护成员,但不是类的成员函数
友元函数不能用const修饰
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数
友元函数的调用与普通函数的调用原理相同
2.友元类:
1.概念:
友元类的成员函数都可以是另一个类的友元函数,并且可以访问非公有的成员变量。
友元关系是单向的,不具有交换性:
下面这个例子:B是A的友元,说明A把B当成朋友。B就可以随便使用A的成员函数和访问A类的私有。但是B不一定把A当作朋友所以A不可以随便访问B的成员函数或者私有成员变量。
友元关系不能传递:
如果C是B的友元, B是A的友元,则不能说明C是A的友元。
友元关系不能继承:
四:内部类:
1. 概念:
如果一个类定义在另一个类的内部,这个【内部】的类就叫做【内部类】。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
2. 特性:
- 内部类可以定义在外部类的public、protected、private都是可以的。
- 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
- sizeof(外部类)=外部类,和内部类没有任何关系。
- A和B的关系,他们都是一个普通类。只是关系比较密切B受到A的访问限定符的限制。B作为A的友元可以随便访问成员函数或者成员变量。
- 本质:多了一个封装+多了一个友元!
3.应用:
题目链接
思路二:
1.思路一有可能出现问题在solution创建新的对象导致数值错误我们使用下面的优化方法就不可能出现这样的问题!
2.可不可以把用来构造记录个数的类作为solution的内部类定义solution的私有为_i _sum,通过内部类是外部类的友元操作到的外部类的成员变量。外部类的成员函数自然可以访问到静态成员变量。
class Solution {
public:class A{public:A(){_sum+=_i;_i++;}static int Get_Sum(){return _sum;}};int Sum_Solution(int n) {A arr[n];return A::Get_Sum(); }private:static int _i;static int _sum;
};int Solution::_i=1;
int Solution::_sum=0;
五:拷贝构造时的优化:
1.概念:
在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。
2.引入:
情景一:
1.问题?
因为理论上发生了隐式类型的转换所以会发生一次构造和一次拷贝构造,但是根据打印结果显示只发生了一次构造和一次析构?
答:因为编译器进行了优化,条件是必须在一行进行构造+拷贝构造!
情景二:
进行构造和拷贝构造不在同一行,通过代码执行发现编译器没有对这样的操作进行优化!
情景三:
补充整形值是具有常性的所以构造函数的参数是const类型的参数!
情景四:
拷贝构造+拷贝构造—》拷贝构造
相关文章:

[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
(static成员 explicit 友元函数 内部类 编译器优化) 一.static 成员:1.概念引入:1-1:定义全局变量记录个数? 2.如果有多个类需要分开去记录类对象的个数?2-1:可不可以声明成员变量解决&#…...

ONES Design UI 组件库环境搭建
这个 ONES Design UI 组件库 是基于 Ant Design 的 React UI 组件库,主要用于企业级研发管理工具的研发。 首先用 React 的脚手架搭建一个项目: npx create-react-app my-app cd my-app目前 ONES Design UI 组件库 托管在 ONES 私有的 npm 仓库上, 因此…...

支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新
支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具,也是一个数字生活平台,通过…...

taro全局配置页面路由和tabBar页面跳转
有能力可以看官方文档:Taro 文档 页面路由配置,配置在app.config.ts里面的pages里: window用于设置小程序的状态栏、导航条、标题、窗口背景色,其配置项如下: tabBar配置:如果小程序是一个多 tab 应用&…...

【k8s】pod进阶
一、资源限制 1、资源限制的概念 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上…...

【设计模式】第18节:行为型模式之“迭代器模式”
一、简介 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。 在通过迭代器来遍历集合元素的同时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍…...

【数据结构】单链表OJ题
前言: 本节博客将讲解单链表的反转,合并有序链表,寻找中间节点及约瑟夫问题 文章目录 一、反转链表二、合并有序链表三、链表的中间结点四、环形链表的约瑟夫问题 一、反转链表 要反转链表,我们需要遍历链表并改变每个节点的 next 指针&#…...

智能工厂架构
引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <...

阿里云多款ECS产品全面升级 性能最多提升40%
“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新,为客户创造业务价值。”10月31日,杭州云栖大会上,阿里云弹性计算计算产品线负责人张献涛表示,通过持续的产品和技术创新,阿里云发布了HPC优化实例等多…...

责任链模式(Chain of Responsibility)
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。 public abstract class Handler {protected Handler successor;public abstract void handlerRequest(String condition);protected Handler getSuccessor()…...

文件管理技巧:根据大小智能分类并移动至目标文件夹
在文件管理过程中,我们经常需要整理大量的文件。根据文件的大小,将其智能分类并移动至目标文件夹,可以帮助我们更高效地管理文件,提高工作效率。通过使用云炫文件管理器可以根据文件大小进行智能分类和移动至目标文件夹࿰…...

具有自主产权的SaaS门店收银系统全套源码输出
PHPMysql前后端分离, 小程序线上商城; 进销存管理库存盘点, 多仓库库存调拨, 会员系统。 消费者扫码查价系统。...

论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings
1. 优势 现存的emmbedding应用在新的task或者domain上时表现会有明显下降,甚至在相同task的不同domian上的效果也不行。这篇文章的重点就是提升embedding在不同任务和领域上的效果,特点是不需要用特定领域的数据进行finetune而是使用instuction finetun…...

[BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
居然把第3周忘了写笔记了. 后边难度上来了,还是很有意思的 Crypto Rabins RSA rsa一般要求e与phi互质,但rabin一般用2,都是板子题也没什么好解释的 from Crypto.Util.number import * from secret import flag p getPrime(64) q getPrime(64) assert p % 4 3 assert q %…...

软件测试---边界值分析(功能测试)
能对限定边界规则设计测试点---边界值分析 选取正好等于、刚好大于、刚好小于边界的值作为测试数据 上点: 边界上的点 (正好等于);必选(不考虑区开闭) 内点: 范围内的点 (区间范围内的数据);必选(建议选择中间范围) 离点: 距离上点最近的点 (刚好…...

使用pytorch处理自己的数据集
目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…...

http进一步认识
好久不见各位,今天为大家带来http协议的进一步认识 文章目录 👀http协议的认识👀新的改变 👀http协议的认识 http协议经历了三个版本的演化,HTTP0.9是第一个版本的协议,它的组成极其简单,只涉…...

grafana docker安装
grafana docker安装 Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。目前使用grafana的公司有很多,如paypal、ebay、intel等。 Grafana 是 Graphite 和 InfluxDB 仪表盘和图形编辑器。Grafana 是开…...

【Kubernetes】初识k8s--扫盲阶段
文章目录 1、k8s概述2、为什么要有k8s2.1 回顾以往的应用部署方式2.2 容器具有的优势 3、k8s能带来什么 1、k8s概述 kubernetes是一个可移植、可扩展的开源平台,用于管理 容器化 的工作负载和服务,可促进申明式配置和自动化。kubernetes拥有一个庞大且快…...

“01”滴答“摩尔斯电码”加密解密单个字符
“01”替换滴嗒“.-”“摩尔斯电码”字符,加密解密键盘输入的单个字符。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&a…...

P3817 小A的糖果
Portal. 贪心。 注意到这里的盒子不会被删除,只会改变盒子的值。问题立刻简单化了。对于一组相邻的糖果个数和大于 x x x 的盒子组,优先吃掉靠后的盒子。 证明正确性也很显然,因为减少后面的盒子的糖果数可以使得后面的情况更优。 #incl…...

Yolov8目标识别与实例分割——算法原理详细解析
前言 YOLO是一种基于图像全局信息进行预测并且它是一种端到端的目标检测系统,最初的YOLO模型由Joseph Redmon和Ali Farhadi于2015年提出,并随后进行了多次改进和迭代,产生了一系列不同版本的YOLO模型,如YOLOv2、YOLOv3、YOLOv4&a…...

HandlerMethodArgumentResolver方法参数解析器支持多用户
1、概述 HandlerMethodArgumentResolver,中文称为方法参数解析器,是Spring Web(SpringMVC)组件中的众多解析器之一,主要用来对Controller中方法的参数进行处理。 使用场景 在一般的接口调用场景下,每次调用Controller都需要检查请求中的token信息,并根据token还原用户信息…...

【Linux】 man命令使用
介绍 man命令是Linux下最核心的命令之一。而man命令也并不是英文单词“man”的意思,它是单词manual的缩写,即使用手册的意思。 man命令会列出一份完整的说明。 其内容包括命令语法、各选项的意义及相关命令 。更为强大的是,不仅可以查看Lin…...

同一个数据库服务器进行数据表间的数据迁移-MySQL
同一个数据库服务器进行数据表间的数据迁移 一、相同结构的表数据迁移/备份/导入到同一MySQL的某个库的某张表 实验目标:将t1.table_one的数据备份到migration_one.table_11(提醒:这两个表结构一致) 同一个MySQL中有很多库&…...

适用于 Linux 的 WPF:Avalonia
许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开…...

【教3妹学编程-算法题】数组中两个数的最大异或值
3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包” 2哥 :3妹,什么事呀这么开心呀。 3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。 2哥&…...

STM32-RTC实时时钟
目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1:显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2:闹钟 常规配置 RTC配置 测试环节 实验现象 R…...

初学Flutter,实现底部导航切换
效果展示 flutter bottomNavBar 主要实现代码 入口文件:main.dart import package:flutter/material.dart; import package:flutter_demo/components/bottomNavBar.dart; import package:flutter_demo/views/cart.dart; import package:flutter_demo/views/cata.d…...

使用JMeter进行接口压力测试
1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试,结果反馈如下图...