当前位置: 首页 > news >正文

[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.总结:

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受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();      }
};

两个问题:

  1. 静态成员函数可以调用非静态成员函数吗?
    答:不可以: 静态成员函数没有this指针不可以调用非静态成员函数并且不可以调用非静态成员变量。

  2. 非静态成员函数可以调用类的静态成员函数吗?
    答:可以 :静态成员函数只是收到类域的限制我们想要使用静态成员函数需要指定类域。

二.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. 特性:

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。
  4. A和B的关系,他们都是一个普通类。只是关系比较密切B受到A的访问限定符的限制。B作为A的友元可以随便访问成员函数或者成员变量。
  5. 本质:多了一个封装+多了一个友元!
    请添加图片描述

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 友元函数 内部类 编译器优化&#xff09; 一.static 成员&#xff1a;1.概念引入&#xff1a;1-1&#xff1a;定义全局变量记录个数&#xff1f; 2.如果有多个类需要分开去记录类对象的个数&#xff1f;2-1&#xff1a;可不可以声明成员变量解决&#…...

ONES Design UI 组件库环境搭建

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

支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新

支付宝是全球领先的独立第三方支付平台&#xff0c;致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验&#xff0c;及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具&#xff0c;也是一个数字生活平台&#xff0c;通过…...

taro全局配置页面路由和tabBar页面跳转

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

【k8s】pod进阶

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

【设计模式】第18节:行为型模式之“迭代器模式”

一、简介 迭代器模式&#xff08;Iterator Design Pattern&#xff09;&#xff0c;也叫作游标模式&#xff08;Cursor Design Pattern&#xff09;。 在通过迭代器来遍历集合元素的同时&#xff0c;增加或者删除集合中的元素&#xff0c;有可能会导致某个元素被重复遍历或遍…...

【数据结构】单链表OJ题

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

智能工厂架构

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

阿里云多款ECS产品全面升级 性能最多提升40%

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

责任链模式(Chain of Responsibility)

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

文件管理技巧:根据大小智能分类并移动至目标文件夹

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

具有自主产权的SaaS门店收银系统全套源码输出

PHPMysql前后端分离&#xff0c; 小程序线上商城&#xff1b; 进销存管理库存盘点&#xff0c; 多仓库库存调拨&#xff0c; 会员系统。 消费者扫码查价系统。...

论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings

1. 优势 现存的emmbedding应用在新的task或者domain上时表现会有明显下降&#xff0c;甚至在相同task的不同domian上的效果也不行。这篇文章的重点就是提升embedding在不同任务和领域上的效果&#xff0c;特点是不需要用特定领域的数据进行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 %…...

软件测试---边界值分析(功能测试)

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

使用pytorch处理自己的数据集

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

http进一步认识

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

grafana docker安装

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

【Kubernetes】初识k8s--扫盲阶段

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

“01”滴答“摩尔斯电码”加密解密单个字符

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

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...