[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)

news2024/11/25 12:43:32

(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类型的参数!

在这里插入图片描述

情景四:

拷贝构造+拷贝构造—》拷贝构造

请添加图片描述

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

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

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

相关文章

单片机温湿度-光照-DHT11-烟雾气体检测控制系统-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;DHT11温湿度&#xff0c;光照、烟雾气体检测&#xff0c;按键设置报警阀值&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 // // …

(免费领源码)php#MySQL软件测试文档管理系统28035-计算机毕业设计项目选题推荐

目 录 摘 要 Abstract 第1章 前 言 1.1 研究背景 1.2 开发意义 1.3 系统开发目标 第2章 系统开发环境 6 2.1 HTTP协议 6 2.2 HTML网页技术 6 2.3 B/S结构 6 2.4 PHP脚本语言 7 2.5 MySQL数据库 7 2.6 Apache简介 8 第3章 需求分析 3.1 需求分析 3.2 系统可…

ChatGPT商务英语邮件写作方法及案例模板

目录 1 前言 2 商务英语email写作技巧 3 商务email完整模板 4 求学科研email模板 5 工作email模板 6 商务沟通email模板 在现代商务环境中&#xff0c;通过电子邮件进行沟通已经成为一种普遍的方式。良好的商务英语邮件写作技巧和模板能够帮助我们有效地传达信息&#xf…

K8s-----pod详解

目录 一、Pod介绍 1、Pod的基础概念 2、pod定义&#xff08;资源清单&#xff09; 二、Pod相关实例 1、初始化容器&#xff08;init容器&#xff09; 2、镜像拉取策略&#xff08;image PullPolicy&#xff09; 3、pod容器重启策略&#xff08;restartPolicy&#xff09…

自定义类型枚举

目录 枚举类型枚举类型的声明扩展枚举类型的优点枚举的优点 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f…

取消elementUI中table的选中状态和勾选状态赋值

一、取消所有选中 1、表格上绑定ref 2、清空用户选中数据 this.$refs.loopRef.clearSelection()二、勾选状态赋值 获取数据&#xff0c;flag为true则是选中状态&#xff0c;并将前面勾选框设为选中状态 this.listData.forEach(item> {if(row.flag1){this.$refs.loopRef.to…

elasticsearch索引按日期拆分

1.索引拆分原因 如果单个索引数据量过大会导致搜索变慢&#xff0c;而且不方便清理历史数据。 例如日志数据每天量很大&#xff0c;而且需要定期清理以往日志数据。例如原索引为sc_all_system_log&#xff0c;现按天拆分索引sc_all_system_log20220902&#xff0c;sc_all_syste…

IOS渲染流程之提交图层数据至RenderThread进程

大致链路 UIView/CALayer---->CoreAnimation./Core Graphics/Core Image---->GPU Drive-->GPU 图层树/视图树 一个UIView&#xff08;视图&#xff09;对应一个CALayer&#xff08;图层&#xff09;&#xff0c;CALayer对应显示的数据其有个content代表Bitamp&#…

答题测评考试小程序的效果如何

在线答题系统是一种在线练习、考试、测评的智能答题系统&#xff0c;适用于企业培训、测评考试、知识竞赛、模拟考试等场景&#xff0c;管理员可任意组题、随机出题&#xff0c;答题者成功提交后&#xff0c;系统自动判分。 多种题目类型&#xff0c;两种答题模式 练习模式&a…

漏洞复现--大华ICC readpic任意文件读取漏洞

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

Linux--动静态库

1.背景知识 软硬链接&#xff1a; 软硬链接的创建 软链接&#xff1a;ln -s 文件名 s_link 结果&#xff1a; 可以看到text1.txt和s_link->text.txt这两个文件地址&#xff0c;也就是inode编号是不一样的&#xff0c;且硬链接数都为1&#xff1b; 硬链接&#xff1a;l…

VR实景导航在医院内使用有哪些好处?

近年来&#xff0c;VR全景逐渐普及开来&#xff0c;被大众所熟知&#xff0c;而VR全景在医院的应用也是逐渐广泛起来&#xff0c;对于医院各种错综复杂的楼层&#xff0c;VR全景的VR实景导航功能&#xff0c;能够将患者代入一个三维、逼真的虚拟环境中&#xff0c;帮助患者快速…

企业数据库中了360勒索病毒怎么办,勒索病毒解密,数据恢复

随着网络技术的不断发展&#xff0c;越来越多的企业开始走向数字化办公&#xff0c;网络技术的发展给企业的生产运行提供了强有力的支撑。但随之而来的网络安全威胁也不断增加&#xff0c;数据安全成为众多企业关心的主要话题。近期&#xff0c;云天数据恢复中心的工程师接到很…

Pytorch网络模型训练

现有网络模型的使用与修改 vgg16_false torchvision.models.vgg16(pretrainedFalse) # 加载一个未预训练的模型 vgg16_true torchvision.models.vgg16(pretrainedTrue) # 把数据分为了1000个类别print(vgg16_true) 以下是vgg16预训练模型的输出 VGG((features): S…

apollo云实验:定速巡航场景仿真调试

定速巡航场景仿真调试 概述启动仿真环境仿真系统修改默认巡航速度 实验目的福利活动 主页传送门&#xff1a;&#x1f4c0; 传送 概述 自动驾驶汽车在实现落地应用前&#xff0c;需要经历大量的道路测试来验证算法的可行性和系统的稳定性&#xff0c;但道路测试存在成本高昂、…

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据爬取及处理2. 模型训练及保存1&#xff09;协同过滤2&#xff09;矩阵分解3&#xff09;LDA主题模型 3. 接口实现1&#xff09;流行电影推荐2&#xff09;相邻用户推荐3&#xff09;相似内容推荐 相关其它博…

submit使用share buffer传参问题及解决办法

有个程序&#xff0c;因为处理逻辑复杂&#xff0c;时间长&#xff0c;所以启用了job。 本来是直接把耗时的核心函数 in background。 但是这种情况有个麻烦&#xff0c;不方便检查报错信息&#xff0c;只能用SM58监控。 所以改为了open job submit program。因为可以sm37查看…

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…

快手群控软件可同时控制多个账号!

随着社交媒体的普及&#xff0c;越来越多的人开始使用快手平台来分享自己的生活、展示才艺、开展商业活动等&#xff0c;然而&#xff0c;要想在快手上获得更多的关注和收益&#xff0c;需要投入大量的时间和精力&#xff0c;这时&#xff0c;快手群控软件应运而生&#xff0c;…

2023红帽论坛:探索数字化转型的下一步

作为全球领先的企业级开源解决方案提供商&#xff0c;红帽的一举一动在业界都备受关注。 近日&#xff0c;以“探索下一步”为主题&#xff0c;2023红帽论坛在北京盛大揭幕。 红帽全球副总裁兼大中华区总裁曹衡康在主题演讲中表示&#xff0c;智能创新并不是一个单纯依赖技术的…