C++入门(二)

news2024/10/5 14:05:24

C++入门(二)

  • 1.引用
    • 1.1引用概念
    • 1.2引用特性
    • 1.3常应用
    • 1.4使用场景
    • 1.5传值、传引用效率比较
    • 1.6引用和指针的区别
  • 2.内联函数
    • 2.1概念
    • 2.2内联函数的特性
  • 3.auto关键字(C++11)
    • 3.1auto使用细则
  • 4.基于范围的for循环(C++11)
  • 5.指针空值nullptr(C++11)

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容: 引用;内联函数;auto关键字;基于范围的for循环;指针空值nullptr
⬆⬆⬆⬆上一篇:C++入门(一)
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.引用

1.1引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共同用一块内存空间。
格式:类型& 引用变量名(对象名)=引用实体
在这里插入图片描述

1.2引用特性

1.引用类型必须和引用实体是同种类型的
在这里插入图片描述

2.引用在定义时必须初始化
在这里插入图片描述

3.一个变量可以有多个引用
在这里插入图片描述

4.引用一旦引用一个实体,再不能引用其他实体

1.3常应用

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
指针和引用,在赋值和初始化时,权限可以缩小,但是不能放大

1.4使用场景

①做参数
在这里插入图片描述
上图是以前我们如何交换两个值的
在这里插入图片描述
我们不用再像以前一样用指针,过于麻烦,用引用更加好理解,就是给x和y取了个别名而已
这样形参改变,影响实参,我们称之为输出型参数
②做返回值
在这里插入图片描述
在函数返回的时候,分为这个变量是否在出了函数作用域就销毁的情况。如果是一般的返回,就是传值返回,无论是否出作用域销毁,他都会创建一个常属性的临时变量,然后回到主函数,赋值给相应的变量。如果是局部变量,也就是出了作用域就销毁的变量,在返回的时候,只能依照上面的办法,因为局部变量在函数栈帧销毁时,也可能一并销毁变成了随机值。但如果是一个全局变量,则可以使用传引用返回,因为全局变量出了作用域不会销毁。
在这里插入图片描述
注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给操作系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。

1.5传值、传引用效率比较

在这里插入图片描述
在这里插入图片描述
从上图中可以看出传值和传引用的效率相差还是很大的。
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的临时拷贝,因为用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

1.6引用和指针的区别

在这里插入图片描述
在汇编代码上可以看见引用和指针的操作是一样的,是不是非常震惊。其实本质上在底层实现上实际是有空间消耗的,因为引用是按照指针来实现的,在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

引用和指针的不同点:
①引用概念上定义一个变量的别名,指针存储一个变量的地址
②引用在定义时必须初始化,指针没有要求
③引用初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
④没有NULL引用,但有NULL指针
⑤在sizeof中含义不同;引用结果为引用类型的大小,但指针始终是地址空间所占字节个数
⑥引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
⑦有多级指针,但没有多级引用
⑧访问实体方式不同,指针需要显式解引用,引用编译器自己处理
⑨引用比指针使用起来相对更安全

2.内联函数

2.1概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
查看方式:
1.在release模式下,查看编译器生成的汇编代码中是否存在call 函数名,但是由于系统会给大量优化,可能看不出,因此我们推荐下面一种方法
2.在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,方便调试)
在这里插入图片描述
在这里插入图片描述
按照上面的方法调整一下项目的属性就可以查看内联函数的展开了
在这里插入图片描述
通过右边的汇编,可以看出,Add函数直接在调用的地方展开了,并没有call Add来调用函数的指令

2.2内联函数的特性

①inline是一种以空间换时间的做法,这里的空间指的是最后生成的exe文件,因为如果你调用这个函数的次数多了,那么函数每次都展开,他的代码量就上去了。如果编译器将函数当成内联函数处理,那么在编译阶段,会用函数体替换函数调用
②inline对于编译器而言只是一个建议,不同的编译器关于inline实现的及机制可能不同,一般建议将函数规模小、不是递归、且频繁调用的函数采用inline修饰,否则编译器将会忽略illine的特性
在这里插入图片描述
当我把代码写的稍微复杂并多一点的时候,编译器直接忽略了inline,并调用了Add函数,从右侧的汇编中就能详细看出,编译器call Add
③inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

3.auto关键字(C++11)

auto作为一个类型指示器来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
在这里插入图片描述

3.1auto使用细则

①使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一个类型的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量的实际类型
②auto与指针和引用相结合起来使用:用auto声明指针类型时,用auto*和auto没有任何区别,但用auto声明引用类型时必须加&
在这里插入图片描述
③在同一行定义多个变量:当在同一行声明多个变量时,必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
在这里插入图片描述
④auto不能作为函数的参数
在这里插入图片描述
⑤auto不能直接用来声明数组
在这里插入图片描述

4.基于范围的for循环(C++11)

在这里插入图片描述
如果想要改变数组的元素,就可以用到前面学习的引用
在这里插入图片描述
for循环后的括号由冒号:分为两部分:第一个部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
使用条件:
1.for循环迭代的范围必须是确定的,对于数组而言就是数组的第一个元素和最后一个元素的范围
2.迭代的对象必须要实现++和==的操作
现在只要掌握怎么用就好,现在毕竟是C++入门,后面会详细讲的

5.指针空值nullptr(C++11)

在这里插入图片描述
对于NULL的定义就是如果使用了C++,那么NULL就为0,因此下面的代码就会出现问题,只能把NULL强制转换为int才能得到想要的结果
在这里插入图片描述
因此C++11引入了nullptr
注意:
①在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
② 在C++11中,sizeof(nullptr) 与 sizeof((void
)0)所占的字节数相同。
③为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

🌸🌸C++入门(二)的知识大概就讲到这里啦,博主后续会继续更新更多L的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

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

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

相关文章

题库——“C”

由于小雅兰的C语言程序设计考试的时间实在是越来越近了,那么,这篇博客也就产生了,这篇博客的主要内容是一些C语言程序设计的练习题,现在,就让我们一起进入C语言的世界吧。 1.函数fun的功能是:将形参n中&…

Java Agent 内存马攻防

前言 在 jdk 1.5 之后引入了 java.lang.instrument 包,该包提供了检测 java 程序的 Api,用于监控、收集性能信息、诊断问题等。通过 java.lang.instrument 实现的工具我们称之为 Java Agent ,Java Agent 能够在不影响正常编译的情况下来修改…

黑马主播单场带货千万,抖音直播市场还有哪些新机遇?

1月受春节假期影响,主播带货场次降低,抖音直播电商市场略显低迷,据新抖『直播带货风向』大盘数据显示,1月平台直播销量与去年12月相比下降39.55%,直播销售额下降也较为明显。了解更多行业带货风向,可点此处…

【C++11】可变参数模板

目录 可变参数模板 函数递归展开参数包 逗号表达式展开参数包 emplace_back 可变参数模板 其实C语言中我们就一直在使用可变参数列表。 C11 的新特性可变参数模板能够让我们创建可变参数的函数模板和类模板,相比C98和C03,类模板和函数模板中只能传入…

19《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限,如果错误欢迎批评指正。 第四章:Protein Binding Leads to Biological Actions (蛋白质的结合会产生生物作用) -布朗棘轮在耦合结合的过…

独角兽大牛纯手肛出的一份多线程实战文档,莫把它丢进收藏夹吃灰

为什么用多线程? 在操作系统级别上,程序的执行都是以进程为单位,而每一个进程中通常都会有多个线程线程互不影响地并发执行,那么为什么要使用多线程呢?其实,多线程的使用为程序研发带来了巨大的便利&#…

删除重复数字的三种方法(详解)

前言:本期是关于去重数字的三种方法详解,今天你c了吗? 输入描述: 第一行,输入一个整数n,表示序列有n个整数。 第二行输入n个整数(每个整数大于等于1,小于等于1000)&…

关于模板字面量,我有点好奇它的内部结构

前言 最近翻看源码的时候,发现一些有趣的 JS 的知识点,基于日常的开发经验,我做了一些联想和对比。整个过程充满了乐趣。 于是我想,是不是可以延续这种创意带来的学习的乐趣。 带的富含创造力夜晚的 buff,确实让我拥…

一、系统编程常用api

一、文件io文件io是linux系统提供的接口,针对文件和磁盘进行操作,不带缓存机制标准io是c语言函数库里的标准io模型,在stdio.h中定义,通过缓冲区操作文件,带有缓存机制标准 IO 和文件 IO 的区别如下图所示:文…

SSD(固态) VS HDD(机械),购买指南

大多数人买电脑的时候纠结买固态硬盘(SSD)还是机械硬盘(HDD)。哪个是最佳选择呢,是固态硬盘还是机械硬盘呢?这个问题没有直接的答案,每个购买者有不同的需求, 需要根据需求做选择。这些需求像是性能、和预算…

DS18B20测量温度液晶1602显示

DS18B20温度传感器简介DS18B20是一种数字温度传感器。它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。DS18B20温度传感器特点1、单线接口:DS18B20仅需一条线可实现与微处理器双向通信。…

泰山服务器板载 HNS3 网卡绑核无法充分利用 CPU 的解决思路

文章目录前言解决方案排查过程应用程序运行环境与方式检查是否存在 irqbalance 进程检查中断号对应的 CPU 亲和尝试其他绑核方式尝试调整队列数量:核心数量为 2:1前言 前段时间在泰山服务器上进行性能测试,预期是应用进程能够占满机器大部分 CPU。但实际上&#xf…

书城第二阶段——用户注册和登陆

目录0.0 JavaEE 项目的三层架构0.1 项目阶段二:用户注册和登陆的实现。1、先创建书城需要的数据库和表。2、编写数据库表对应的JavaBean对象。3、编写工具类 JdbcUtils3.1、导入需要的 jar 包(数据库和连接池需要):3.2、在 src 源…

钉钉一键登录第三方网站

钉钉一键登录第三方网站序钉钉开发者后台H5微应用应用代码开发登录页面login.html登录实现LoginController.javapom.xml增加一键登录效果展示序 企业内部系统已经做过了钉钉扫码登录,现在需要添加钉钉一键登录第三方网站功能,这里主要记录一键登录整个实…

物联网终端设备的工作原理和功能讲解

物联网终端设备是实现数据采集和数据传输的设备,它连接了传感网络层和传输网络层,起到了数据采集、数据处理、数据加密和传输的功能。 物联网终端设备由传感器、外部传感接口、CPU和外部通讯组成,工作原理是通过外部传感接口与传感设备连接&a…

和平精英军需精打细算天花板,330拿下一整套军需

和平精英军需精打细算天花板,330拿下一整套军需! #和平精英 #这游戏不花钱 #游戏凡星计划 军需精打细算天花板,一个月时间花 110 块获得 436 个军需币。拿个新军需的副套问题不大。要知道和平小店的暖弄大礼包, 100 左右&#…

一次在 classpath 使用通配符导致的偶发问题排查与建议

说起 Classpath,使用 Java 的同学应该都不会陌生。不过,目前的项目基本都会使用 Maven 等构建工具管理,开发过程中也会使用高度智能化的 IDE,在日常使用中直接涉及 Classpath 操作可能不多。前段时间遇到一个跟 Classpath 相关的偶…

【My Electronic Notes系列——触发器】

目录 序言: 🏆🏆人生在世,成功并非易事,他需要破茧而出的决心,他需要永不放弃的信念,他需要水滴石穿的坚持,他需要自强不息的勇气,他需要无畏无惧的凛然。要想成功&…

【栈】单调栈详情介绍及其运用

单调栈单调栈的概述(Overview)何时使用单调栈模拟单调递增栈单调栈的运用(算法练习题)模板【练习一、单调栈】739. 每日温度【练习二、单调栈哈希表】496. 下一个更大元素 I【练习三、单调栈循环数组】503. 下一个更大元素 II【练…

Word处理控件Aspose.Words功能演示:使用 C++ 处理 Word 文档中的目录

Aspose API支持流行文件格式处理,并允许将各类文档导出或转换为固定布局文件格式和最常用的图像/多媒体格式。 Aspose.words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和…