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

Learning C++ No.7

引言:

北京时间: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,明天开学,上述内容,我知道有一些的摆烂,没什么时间写,也不怎么想写了,所以撤了,收拾东西去了,各位学校见。

相关文章:

Learning C++ No.7

引言&#xff1a; 北京时间&#xff1a;20223/2/9/22:20&#xff0c;距离大一下学期开学还有2天&#xff0c;昨天收到好消息&#xff0c;开学不要考试了&#xff0c;我并不是害怕考试&#xff0c;考试在我心里&#xff0c;地位不高&#xff0c;可能只有当我挂了&#xff0c;才能…...

【MyBatis】第八篇:一级,二级缓存

其实缓存字面的意思就是将一些内容缓存下来&#xff0c;等下次使用的时候可以直接调用&#xff0c;通过数据库得到数据&#xff0c;有时候会使用相同的数据&#xff0c;所以mybatis自然也支持缓存。 而mybatis按照缓存的效果可以分两大类&#xff1a;一级缓存和二级缓存。 一…...

【大唐杯备考】——5G基站开通与调测(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G基站开通与调测。 目录&#x1f552; 1. 概述&#x1f552; 2. 5G基站开通与调测基础&#x1f558; 2.1 3.5GHz单模100MHz配置&#xff08;S111&#xff09;&#x1f558; 2.2 3.5GHz单模100MHz配置&#xff08;S111111&#xff09;&a…...

redhat7 忘记root密码,重置办法

来自https://www.tracymc.cn/archives/802 亲测可用&#xff0c;太感谢了&#xff0c;在此记录一下&#xff0c;原文有图 1.启动的时候,在有启动项界面,相应启动项内核名称上按“e”; 2.进入后,找到linux16开头的地方,按“end”键或者controle到最后,输入rd.break,再按ctrlx进…...

QML- 对象属性

QML- 对象属性一、概述二、id 属性三、Property 属性1. 定义属性1. 自定义属性定义中的有效类型2. 为属性属性赋值1. 初始化时的值赋值2. 命令式赋值3. 静态值和绑定表达式值4. 类型安全5. 特殊属性类型1. 对象列表属性2. 分组属性6. 属性别名1. 属性别名的注意事项2. 属性别名…...

将.js文件转成vue标签结构的样式

例如&#xff1a;下图所示&#xff1a; 依次识别获取.js文件中的tag和props&#xff0c;可以理解为字符串拼接&#xff0c;将整个vue的标签结构看作是一个字符串。 话不多说&#xff0c;先放上完整代码&#xff0c;思路看代码备注。&#xff08;自己实现的时候&#xff0c;可以…...

前端知识点复盘

组件和jsx <body><div id"root"></div><script type"text/babel">const root ReactDOM.createRoot(document.getElementById("root"))class App extends React.Component {render() {return (<div> <h1>s…...

前端JavaScript获取图片文件的真实格式

常见方式判断图片格式 当我们进行前端开发&#xff0c;需要处理图片上传功能&#xff0c;针对图片格式做判断时&#xff0c;常规的方法都是使用文件后缀名来判断&#xff0c;如下代码所示&#xff1a; input.addEventListener(change, (e) > {const file e.target.files[…...

今天面了一个来华为要求月薪25K,明显感觉他背了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

11 Advanced CNN

文章目录GoogLeNetInception Module1x1 Conv计算效果代码实现总结ResNet (残差网络)问题引入梯度消失与传统神经网络的比较代码实现课程来源&#xff1a; 链接对于前篇中所提到问题&#xff0c;设计出的是一种类似于LeNet5的线性结构&#xff0c;而对于大多数问题&#xff0c;简…...

亿级高并发电商项目---万达商城项目搭建(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

UML术语标准和分类

一、UML术语标准 1&#xff0e;中文UML术语标准 中国软件行业协会&#xff08;CSIA&#xff09;与日本UML建模推进协会&#xff08;UMTP&#xff09;共同在中国推动的UML专家认证&#xff0c;两个协会共同颁发认证证书、两国互认&#xff0c;CSIA与UMTP共同推出了UML中文术语…...

LeetCode 刷题系列 -- 151. 反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格或…...

二十二、Gtk4-ListView

GTK 4添加了新的列表对象GtkListView、GtkGridView和GtkColumnView。这个新特性在Gtk API参考—列表小构件概述中有描述。 GTK 4还有其他实现列表的方法。它们是GtkListBox和GtkTreeView&#xff0c;它们是从GTK 3接管的。在Gtk开发博客中有一篇关于Matthias Clasen所写的列表…...

ASP.NET Core3.1实战教程---基于Jquery单文件上传

这个必须记录一下费劲啊&#xff01;废了我2天的时间&#xff0c;昔日的net快速已经没落....就文件上传都这么费劲。 先说下要求&#xff08;在线apk文件上传实现手机端整包更新&#xff09;&#xff1a; 1、为了简化需求文件上传和数据提交分开执行 2、选完文件后按钮变成上…...

10 卷积神经网络CNN(基础篇)

文章目录全连接CNN过程卷积过程下采样过程全连接层卷积原理单通道卷积多通道卷积改进多通道总结以及课程代码卷积改进PaddingStride下采样过程大池化层&#xff08;Max Pooling&#xff09;简单卷积神经网络的实现课程代码本篇课程来源&#xff1a; 链接部分文本来源参考&#…...

Windows下LuaBridge2.8的环境配置及简单应用

Windows下LuaBridge2.8的环境配置及简单应用 LuaBridge2.8下载链接&#xff1a; https://github.com/vinniefalco/LuaBridge/tags 关于Lua的环境配置可参考以下链接&#xff08;这里不做简述&#xff09;&#xff1a; https://ufgnix0802.blog.csdn.net/article/details/125341…...

每天10个前端小知识 【Day 10】

前端面试基础知识题 1. es5 中的类和es6中的class有什么区别&#xff1f; 在es5中主要是通过构造函数方式和原型方式来定义一个类&#xff0c;在es6中我们可以通过class来定义类。 class类必须new调用&#xff0c;不能直接执行。 class类执行的话会报错&#xff0c;而es5中…...

【LeetCode】1223. 掷骰子模拟

1223. 掷骰子模拟 题目描述 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束&#xff0c;就是使得投掷骰子时&#xff0c;连续 掷出数字 i 的次数不能超过 rollMax[i]&#xff08;i 从 1 开始编号&#xff09;。 现在&#xff0c;…...

SPSS数据分析软件的安装与介绍(附网盘链接)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...