Learning C++ No.7

news2024/11/27 22:23:30

引言:

北京时间:20223/2/9/22:20,距离大一下学期开学还有2天,昨天收到好消息,开学不要考试了,我并不是害怕考试,考试在我心里,地位不高,可能只有当我挂了,才能意识到吧!哈哈哈!我害怕的是为了要去复习而没有什么时间去更新我的博客了,害怕C++中的肉都给别人抢走了,害怕连汤都喝不上,所以此时当我知道了考试可以延后两个星期的时候,我是开心的,心情异常的好,对了,此时这里记录一下,就在刚刚,我报名了我大学生活中的第一个组织,好像叫什么图书馆助手的,但是还没被选上,结果在之后的博客中你们一定可以看到,此时我们带着对未来的美好憧憬和好心情,开始学习我们的C++吧!在这里插入图片描述

回顾类和对象

进入新的知识的学习,通过上篇博客,此时我们把类和对象的相关知识都搞定的差不多了,此时我们就要开始学习类和对象之后的知识了,如:STL库之类的,所以在我们进入到新的学习中去的时候,我们把上篇博客的内容先做一个回顾,并且为我们即将要学的新内容做一定的铺垫,这样就可以使我们的C++路途变得更加的光明。

所以此时我们就用一个题目来复习一下static的使用和匿名对象的使用

如题:求1+2+3+4+……+n,要求使用静态成员变量的方法

ok!看到这个题目,我们知道我们肯定见过,也实现过,只是我们使用的方法是循环或者递归而已,所以我们此时应该怎样用static来实现呢?
如图中代码:
在这里插入图片描述
看到上述的代码我们可以浅浅的把静态成员变量和静态成员函数,匿名对象的使用给小小的复习一下,此时我们深入看一下什么是静态成员变量,我们从一个问题出发。
问题:为什么静态成员变量要在类外初始化,不可以在类里面进行初始化呢?
原因:当我们使用了static,在类外定义一个变量的时候,此时该变量就已经在静态区存储好了,所以当我们使用类创建了多个对象的时候,其实本质上,这些对象使用的都是同一块内存中的数据
具体原理就是静态成员提供了一个同类对象的共享机制,所以该类所定义的对象共享同一个静态成员变量(无论定义多少个对象,他们的static成员变量都是同一个)所以静态成员变量属于整个类,不属于某个对象;得出这个结论,因为不属于某个对象所以就不可以在类中进行初始化(反向理解,就是如果你初始化了,此时这个静态成员变量就属于该对象了),所以不可以给缺省值,因为给了缺省值,这个值就是用于初始化列表给静态成员变量定义的,所以间接是进行了在类中进行静态成员变量的定义;并且,又由于在我们实例化对象的时候,静态成员变量也是在这个对象空间中,如果此时我们进行不止一个该类对象的实例化,然后此时对每个类对象中的静态成员变量进行定义,就会因为此时的静态成员变量是在静态区的,只有唯一的一块空间,导致重复定义的问题或者竞争定义的问题,所以编译器是不允许这样的情况的,所以总的来说,静态成员变量要事先在类的外部进行定义,不允许在类的内部进行定义。

铺垫光明之路

上述问题有助于我们很好的把static这块的知识搞定,所以接下来我们就开始为我们的C++光明之路铺垫一下,学习了解一些有关编译器系统和类中的特殊知识,为类和对象过度到新知识架好桥梁,Come on.

类中类的认识

并且此时内部类天生就是外部类的友元哦!了解就行,平时很少用的。

编译器内部优化

该编译器的优化一般就是针对于那种构造完就拷贝构造的情况,例:A a = 1;会先构造出一个A类型的临时变量,然后再把该临时变量拷贝构造给a,这就涉及了构造和拷贝构造连续进行,此时我们的编译器就会对其进行优化,所以我们大致以这个方向进行系统优化的学习,但前提是你的编译器当中有优化这个操作的执行,不是所有的编译器都是有自动优化这个功能的。

传值传参中的系统优化

在这里插入图片描述
如下代码:

#include<iostream>
using namespace std;

class A
{
public:
	A(int a = 1)
	{
		cout << "证明调用构造函数" << endl;
	}
	A(const A& aa = 1)
	{
		cout << "证明调用拷贝构造函数" << endl;
	}
	~A()
	{
		cout << "证明调用了析构函数" << endl;
	}
private:
	int _a;

};
void Function1(A aa1)
{

}
void Function2(const A& aa)
{

}

int main()
{
	//A aa1 = 1;        //构造+拷贝构造 -> 优化为直接构造(前提是在同一个表达式中)
	//Function1(aa1);    //此时这个只会调用一次的拷贝构造
	//Function1(2);      //构造+拷贝构造 -> 优化为直接构造(前提是在同一个表达式中)
	//Function1(A(3));   //构造+拷贝构造 -> 优化为直接构造(前提是在同一个表达式中)
	A aa1 = 1;        //重点:因为这个不是进行直接传参,所以此时涉及临时变量,只有涉及到传参时,才不会有临时变量,而是直接使用形参这个局部变量
	Function1(aa1);    //此时如何理解析构函数的调用,因为此时我用aa1就拷贝了aa,aa是该函数的一个局部变量,是一个形参,所以当函数结束之后,aa就要销毁,此时不是临时变量,是局部变量(这里要区别析构函数对main函数中对象的销毁和对其它函数中局部变量的销毁)
	Function1(2);      //这个也是因为直接进行传参,被编译器优化成了直接构造,所以是直接使用形参,局部变量,所以函数调用完之后,需要调用析构函数进行清理工作
	Function1(A(3));   //这个也是因为直接进行两次传参,没有涉及临时变量,所以使用了两次的形参传递,所以调用两次析构函数
	
	return 0;
}

传引用传参的系统优化

在这里插入图片描述
代码及注释:

#include<iostream>
using namespace std;

class A
{
public:
	A(int a = 1)
	{
		cout << "证明调用构造函数" << endl;
	}
	A(const A& aa = 1)
	{
		cout << "证明调用拷贝构造函数" << endl;
	}
	~A()
	{
		cout << "证明调用了析构函数" << endl;
	}
private:
	int _a;

};
void Function2(const A& aa)
{

}
int main()
{
	A aa1 = 1;
	Function2(aa1);//此时这个是传引用传参,所以根本不涉及构造函数和拷贝构造函数,所以无优化(简单理解:就是把自己直接当作形参)
	Function2(2);  //这个就是直接构造一个A类型的变量然后传给参数,此时那个参数就是这个构造出来的变量的别名,所以有构造和析构(所以这个是不需要优化的),因为根本就没有拷贝构造
	Function2(A(3));//第一次传参同理,需要临时变量,第二次传参不涉及临时变量

	return 0;
}

传返回值的系统优化

在这里插入图片描述代码注释如下:

#include<iostream>
using namespace std;

class A
{
public:
	A(int a = 1)
	{
		cout << "证明调用构造函数" << endl;
	}
	A(const A& aa = 1)
	{
		cout << "证明调用拷贝构造函数" << endl;
	}
	~A()
	{
		cout << "证明调用了析构函数" << endl;
	}
private:
	int _a;

};

A Function3()
{
	A aa;//此时重点讲的是,构造和拷贝构造不在同一行的情况之下,是不涉及优化的,只有在同一行才有优化(此时该行就是构造)
	return aa;//构造好之后返回就是拷贝构造了,并且此时就涉及到了临时变量的返回,有常属性,并且虽然此时是临时变量,但是因为上面的aa是局部变量,所以也需要一次析构
}
A Function4()
{
	return A();//总:匿名对象返回是更好的,编译器优化更好
}
int main()
{
	Function3();//不优化(一个构造,一个拷贝构造)
	cout << "___________________________________" << endl;
	A aa1 = Function3();//优化(从一个构造,两个拷贝构造到一个构造,一个拷贝构造)

	cout << "___________________________________" << endl;

	Function4();//优化(此时就是一个步骤,所以就是直接构造)
	cout << "___________________________________" << endl;
	A aa2 = Function4();//优化(此时就是一个)

	return 0;
}

总:接收返回值对象,尽量拷贝构造接收,不要赋值接收;函数中返回对象时,尽量返回匿名对象;并且函数传参是尽量使用const和引用接收函数参数。

在这里插入图片描述

总结:北京时间:2023/2/10/20:09,明天开学,上述内容,我知道有一些的摆烂,没什么时间写,也不怎么想写了,所以撤了,收拾东西去了,各位学校见。

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

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

相关文章

自媒体人都在用的免费音效素材网站

视频剪辑、自媒体人必备的剪辑音效素材网站&#xff0c;免费下载&#xff0c;建议收藏&#xff01; 1、菜鸟图库 音效素材下载_mp3音效大全 - 菜鸟图库 菜鸟图库是一个综合性素材网站&#xff0c;站内涵盖设计、图片、办公、视频、音效等素材。其中音效素材就有上千首&#xf…

数学建模学习笔记(20)典型相关分析

典型相关分析概述&#xff1a;研究两组变量&#xff08;每组变量都可能有多个指标&#xff09;之间的相关关系的一种多元统计方法&#xff0c;能够揭示两组变量之间的内在联系。 典型相关分析的思想&#xff1a;把多个变量和多个变量之间的相关化为两个具有代表性的变量之间的…

【沁恒WCH CH32V307V-R1开发板读取板载温度实验】

【沁恒WCH CH32V307V-R1开发板读取板载温度实验】1. 前言2. 软件配置2.1 安装MounRiver Studio3. ADC项目测试3.1 打开ADC工程3.2 编译项目4. 下载验证4.1 接线4.2 演示效果5. 小结1. 前言 ADC 模块包含 2 个 12 位的逐次逼近型的模拟数字转换器&#xff0c;最高 14MHz 的输入时…

pandas——plot()方法可视化

pandas——plot()方法可视化 作者&#xff1a;AOAIYI 创作不易&#xff0c;如果觉得文章不错或能帮助到你学习&#xff0c;记得点赞收藏评论哦 在此&#xff0c;感谢你的阅读 文章目录pandas——plot()方法可视化一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤…

Python文件的属性获取,重命名,目录的创建,显示和改变

1. 文件的属性获取 os.stat()函数可以获取文件的属性&#xff0c;该函数会返回一个和系统平台有关的stat_result对象&#xff0c; 具备一组可访问的属性&#xff0c;可以通过 stat_result.attribute 这样的格式来访问各个属性的值。 字 段描 述st_modeinode 保护模式st_inoin…

115.Android 简单的多级树结构列表+正常列表结合使用(RecyclerView)

1.第一步 导入需要用到的依赖库: //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0 //RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //刷新控件 implementation com.scwang.smartrefresh:SmartRefre…

python-QGIS环境配置

系统&#xff1a;win10 QGIS的下载及安装 在QGIS的官网下载安装包进行安装 下载得到QGIS-OSGeo4W-3.22.16-1.msi的安装包&#xff0c;除了安装路径&#xff0c;基本下一步就可以安装了安装完成后打开QGIS程序文件夹&#xff0c;在./QGIS xx.xx/bin/目录下有个python-qgis-ltr.b…

SpringBoot 自定义注解实现涉密字段脱敏

关于数据脱敏&#xff0c;网上的文章都是硬编码规则&#xff0c;比如对身份证&#xff0c;手机号&#xff0c;邮件地址等固定写法脱敏。本文在此基础上&#xff0c;拓展动态从数据库查出涉密关键字执行脱敏操作。数据脱敏&#xff1a;把系统里的一些敏感数据进行加密处理后再返…

【prism】路由事件映射到Command命令

在之前的一篇文章中&#xff0c;我介绍了普通的自定义事件&#xff1a; 【wpf】自定义事件总结&#xff08;Action&#xff0c; EventHandler&#xff09;_code bean的博客-CSDN博客_wpf action可以说通过Action和EventHandle&#xff0c;自定义事件是相当的方便简单了。https…

winform开发心得

最近一直在从事winform的开发&#xff0c;每次都是需要从网上查找资料才能对应具体风格要求&#xff0c;现在总结一下。 ui方面可以使用CSkin对应的一套ui&#xff0c;使用步骤 1.在窗口界面&#xff0c;工具箱空白处点击右键&#xff0c;弹出菜单有个”选择项“&#xff0c;点…

ISO7320FCQDRQ1数字隔离器LMG1025QDEETQ1半桥GaN驱动器

1、数字隔离器 DGTL ISO 3000VRMS 2CH 8SOIC型号&#xff1a;ISO7320FCQDRQ1批次&#xff1a;新技术&#xff1a;容性耦合类型&#xff1a;通用隔离式电源&#xff1a;无通道数&#xff1a;2输入 - 侧 1/侧 2&#xff1a;2/0通道类型&#xff1a;单向电压 - 隔离&#xff1a;30…

C语言深度剖析 -- 32个关键字(下)

文章目录if else 语句bool 与 0 的比较float 与 0 的比较指针与 0 的比较switch case 语句do while for 关键字goto语句真的没人使用吗&#xff1f;void 关键字void能否定义变量&#xff1f;void定义指针void修饰函数返回值和作为函数参数return关键字const关键字const修饰的只…

《电脑技术-系统篇》

《电脑技术-系统篇》 重装须知 ​ 备份桌面上资料&#xff0c;包括系统盘中其他的个人文件等。 一、重装系统 ​ 重装系统是指对计算机的操作系统进行重新的安装。当用户错误操作或遭受病毒、木马程序的破坏&#xff0c;系统中的重要文件就会受损导致错误&#xff0c;甚至崩…

详细对比php中类继承和接口继承(php是否支持多继承)

PHP类继承&#xff1a; 1、PHP类不支持多继承&#xff0c;也就是子类只能继承一个父类&#xff0c;但是支持多层次继承 比如&#xff1a; class frist{public function __construct(){echo "我是第一个类。"," ";}public function printer(){echo "…

单片AR眼镜Monocle揭秘:基于反射棱镜,重15g续航1小时

提问&#xff1a;一个戴近视眼镜的人&#xff0c;会愿意再同时戴一副AR眼镜吗&#xff1f;这个问题对于VR来说并不难&#xff0c;通常VR头显为镜框留出了空间&#xff08;一些Pancake VR自带屈光调节机制&#xff09;&#xff0c;因此二者并不冲突。然而AR眼镜体积更紧凑&#…

城市C友会【官方牵头更多的线下交流的机会,你有怎样的期待?】

文章目录&#x1f31f; 课前小差&#x1f31f; 长沙线下&#x1f31f; C友会你也可以是组织者&#x1f31f; 线下交流提升价值&#x1f31f; 官方与抖音合作&#xff1f;&#x1f31f; 23年动起来&#x1f31f; 写在最后&#x1f31f; 课前小差 哈喽&#xff0c;大家好&#x…

九龙证券|中一签可暴赚近9万!兔年第一大肉签来了!弃购的哭了

今天上午&#xff0c;A股商场新股又出大肉签&#xff0c;裕太微-U大涨&#xff0c;中一签盘中最高浮盈近9万元&#xff0c;使得该新股成为近年罕见的“大肉签”。数据显现&#xff0c;最近一两年A股商场单签浮盈超越5万元的新股已比较罕见。 值得注意的是&#xff0c;新股裕太…

2月10日第壹简报,星期五,农历正月二十

2月10日第壹简报&#xff0c;星期五&#xff0c;农历正月二十坚持阅读&#xff0c;静待花开1. 土耳其强震72小时黄金救援期已过&#xff0c;强震已致土叙两国超2万人遇难。2. 吴尊友&#xff1a;未来出现比现在传染性更强变异毒株的可能性非常小&#xff0c;还没“阳”过的孩子…

虎牙盈利能力得到改善,但监管风险对其收入产生负面影响

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 监管风险再次成为焦点 过去一段时间&#xff0c;与中概股相关的监管风险再次引起了投资者的注意&#xff0c;这也是正在考虑投资虎牙&#xff08;HUYA&#xff09;的投资者需要注意的问题。 例如&#xff0c;监管机构在2022…

做专家型服务者,尚博信助力企业数字化转型跑出“加速度” | 爱分析调研

01 从技术应用到业务重构&#xff0c;数字化市场呼唤专家型厂商 企业数字化转型是一个长期且系统性的变革过程。伴随着企业从信息化建设转向业务的数字化重构&#xff0c;市场对数字化厂商的能力要求也在升级。 早期的信息化建设主要是从技术视角切入&#xff0c;采用局部需求…