C++入门:引用、内联函数、auto关键字

news2025/1/16 16:04:48

目录

一:引用

(1)概念

(2)使用

(3)引用的特性

(4)引用的使用场景

【1】做参数

【2】做返回值

(5) 引用的权限问题

(6)引用和指针的区别

【1】引用的底层实现

【2】指针和引用的一些不同

二:内联函数

(1)宏函数

【1】 宏的优点

【2】宏的缺点

(2)内联函数的使用

(3)观察内联函数是否展开

三:auto关键字

(1)概念

(2)实际的应用场景

【1】类型名过长,过于复杂

【2】基于范围的for循环(C++11)

(3)使用时的几个注意点

【1】auto的使用细则

【2】auto也有无法推导的场景

四:指针空值nullptr(C++11)

(1)C++98标准下的指针空值

(2)C++11中的nullptr

五:杂谈


一:引用

(1)概念

      从语法角度讲,引用不是新定义一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟空间,它和它引用的空间共享同一块内存空间。


(2)使用

注意:引用的类型必须和引用实体是同种类型


(3)引用的特性

       引用定义的时候必须初始化

       一个变量可以有多个引用

       引用一旦引用一个实体,就无法再引用其他实体


(4)引用的使用场景

【1】做参数


【2】做返回值

在讲这个内容之前,我先带大家复习一下内存空间。

 

传引用做返回值可以理解直接返回了这个变量。

我们看下面两个例子

 ②

 

 注意:②的情况不同操作系统结果可能不一样(可能栈区回收后会立刻刷新),是标准的未定义行为,而且使用未申请的空间本身就是非法的。


(5) 引用的权限问题


(6)引用和指针的区别

【1】引用的底层实现

引用从语法的角度看好像没有开辟空间,和引用对象共享一片空间,但是在底层实现上引用是有空间的,因为引用是用指针实现的

将这一段代码转化为汇编代码 

 ⭐由此我们可以看出引用本质就是一个指针,但是初始化后无法进行更改由编译器实现解引用


【2】指针和引用的一些不同

其实理解了引用的底层实现后可以依据个人的理解去总结两者不同点,不需要所谓的背诵,我这里就简单的罗列几点:

           ①引用定义时必须初始化,指针没有硬性要求

           ②引用初始化后无法引用其它实体,指针可以修改指向

           ③在sizeof中含义不同,引用为引用的实体的大小,指针为4(32位)或8(64位)字节。

           ④访问实体的方式不同,指针需要手动解引用,引用由编译器实现。

           ⑤引用的使用比指针更加安全

           ⑥语法上引用是给实体取了一个变量,而指针则是保存了实体的空间地址。

           ⑦引用加1是实体加1,指针加1是向后偏移一个所指向类型的大小。

           ⑧有多级指针,但是没有多级引用,下面的代码都是a的引用。


二:内联函数

(1)宏函数

在讲内联函数之前,我先带大家复习一下C语言中的宏函数

(为和函数进行区分,后面简称宏)。


【1】 宏的优点

            ①只是进行单纯的替换不会像函数调用那样开辟栈帧,效率更优。

            ②单纯替换,没有类型检查,面对不同数据类型可能会有优势。

            ③提高代码复用性


【2】宏的缺点

           宏无法调试

           ②只是单纯替换,没有类型检查,不安全。

           ③复用次数很多的情况,可能会导致程序变大。

这里重点讲一下③:

宏只是普通替换,函数是有具体空间的,也就是说你使用100w次Add功能,宏的话要进行100w次替换,函数的话虽然也要调用100w次,但调用的一直是同一个函数。

实现了同样的功能,虽然宏函数效率可能会优一点,但指令数太多,可能导致程序过大。 


(2)内联函数的使用


(3)观察内联函数是否展开

⭐在debug版本下编译器不会进行优化,无论指令多少内联函数都会像正常函数一样调用(目的是为了方便调试),如果想观察是否展开的话,要进行设置。

设置完毕后,按下f10进入调试,右击转到反汇编。

观察调用Add1和Add2函数的汇编代码。

只是观察这个现象,不需要对汇编代码很熟悉。

⭐最后强调一下,基于内联函数的特殊性质,内联函数在汇编时是不会进符号表的,声明定义不要分离,分文件的情况下直接在头文件中进行定义。

(头文件和源文件没有本质区别)


三:auto关键字

(1)概念

auto早期的含义(了解即可):使用auto修饰的变量,是具有自动存储器的局部变量(变量由编译器自动分配和释放,在函数被调用时分配内存,在函数执行结束时释放内存),但是很少有人使用。


C++11中auto被赋予了新的含义:auto不再是存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto定义的变量必须由编译器在编译时期推导而来。

(一句话就是auto定义的变量编译器会依据变量所接收的值来推导变量的类型)


(2)实际的应用场景

【1】类型名过长,过于复杂

⭐像这种情况,我们就可以用auto进行类型的自动推导


【2】基于范围的for循环(C++11)

C++98:

C++11:


范围for的使用条件

  1. for循环迭代的范围必须是确定的 

 2. 迭代的对象要实现++==的操作(涉及到迭代器,没办法展开讲,先了解)


(3)使用时的几个注意点

【1】auto的使用细则



【2】auto也有无法推导的场景



四:指针空值nullptr(C++11)

(1)C++98标准下的指针空值

 ⭐空指针应该也要是一个指针才对,但是C++中却是一个常量0,这在某些情况下可能会产生不必要的麻烦。


(2)C++11中的nullptr

nullptr实际上就是((void *)0),使用nullptr代替NULL可以避免不必要的麻烦。

注意:

         使用nullptr不需要包头文件,nullptr在C++11中作为关键字引入

         ②C++11中,sizeof(nullptr) sizeof((void*)0)所占的字节数相同。

         ③为了提高代码的健壮性,在C++中表示指针空值时建议最好使用nullptr


五:杂谈

这两期的内容其实是在为后面学习C++做一个铺垫,所以不得不暂时忽略一些内容,如果都展开讲的话,我估计没个几万字是讲不完的,大家也不乐意看。

附上一期链接:https://blog.csdn.net/2301_76269963/article/details/130990304?spm=1001.2014.3001.5502


讲几个我自己的观点(我也只是初学者,欢迎各位大佬指正):

①学习C/C++没法避开底层,但并不意味着需要完全掌握底层


②更多的时候是建立一个抽象区,由这个抽象区去链接底层,确保这个抽象区是大体正确,自己所能够理解和接受的。

(就像内存空间我知道分成栈区、静态区、堆区、常量区等等,但是我并不知道系统是怎么分配这些空间的;我知道汇编代码的大意,但我不会写汇编代码,从学习语言的角度也不需要很明确。)


③有的时候必须选择性的忽略一些细节,才能够继续往下学。

(如果一开始接触了C++的输入输出,我就马上想知道它的原理,不可避免的会涉及到类和对象、IO流、运算符重载等等,很容易入门到放弃)

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

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

相关文章

【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

目录 一、学习内容二、数据库事务三、JDBC 的事务管理四、事务的四大特性五、MyBatis六、MyBatis 核心配置文件和基本使用七、查询 student 表(1) 实体映射文件 mapper(2) 读取核心配置文件, 拿到 SqlSession 八、字段和属性名映射(1) mapUnderscoreToCamelCase(2) 完整的 sett…

【Linux】基本开发工具包使用

目录 一, yum ——linux软件包管理器 1. 软件包是啥子? 2. yum基本使用 1. 步骤: 2. 开发工具推荐(centos 7.6) 二,vim —— linux文本编辑器 1. Normal mode —— 命令模式(记不住没关系&#x…

C#,码海拾贝(33)——约化“一般实矩阵”为“赫申伯格矩阵”的“初等相似变换法”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

2023CISCN初赛

两天时间题量还挺大的&#xff0c;简单记录 文章目录 misc签到卡pyshell国粹被加密的生产流量网络安全人才实战能力评价 webunzipdumpitBackendService reversebabyRE pwnfuncanary烧烤摊儿 crypto基于国密SM2算法的密文分发可信度量Sign_in_passwd misc 签到卡 就是做了个p…

CoreDX DDS应用开发指南(2)安装和应用开发

2 CoreDX DDS安装 2.1 系统支持 2.1.1 支持的CPU架构和操作系统 2.1.2 支持的语言和编译器

Linux 实操篇-进程管理(重点)

Linux 实操篇-进程管理(重点) 基本介绍 在LINUX 中&#xff0c;每个执行的程序都称为一个进程。每一个进程都分配一个ID 号(pid,进程号)。>windows > linux每个进程都可能以两种方式存在的。前台与后台&#xff0c;所谓前台进程就是用户目前的屏幕上可以进行操作的。后…

[BJDCTF 2020]easy_md5

TL;DR php弱类型比较md5碰撞绕过&#xff0c;强类型比较传数组绕过ffifdyop md5后的值字符串值为’or’6<乱码>&#xff0c;可用于构造sql注入的bypass没思路了看看网页源代码、看看响应头 过程 拿到题目链接&#xff0c;放到burp里&#xff0c;发现响应头中的提示&am…

JavaScript实现100以内奇数和的代码

以下为实现100以内奇数和的程序代码和运行截图 目录 前言 一、100以内奇数和 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题目要求实现相关使用功能…

软件工程导论(三)系统概要设计

一、系统设计概述 1.1系统设计概述 设计和抽象 系统行为驱动完成设计面向对象设计系统数据驱动完成设计 面向操作的设计 面向数据的设计 设计主要分为三个步骤&#xff1a; 概要设计&#xff1a;接收需求的文档&#xff0c;完成模块的分解 详细设计&#xff1a;根据分解…

Linux 实操篇-网络配置

Linux 实操篇-网络配置 Linux 网络配置原理图 查看网络IP 和网关 查看虚拟网络编辑器和修改IP 地址 查看网关 查看windows 环境的中VMnet8 网络配置(ipconfig 指令) 查看linux 的网络配置ifconfig ping 测试主机之间网络连通性 基本语法 ping 目的主机&#xff08;功能描述…

CXGRid实现拖动鼠标多选

要实现在CXGrid中拖动鼠标多选&#xff0c;您可以按住鼠标左键并拖动鼠标&#xff0c;直到选择了要选择的单元格或行。您可以在拖动过程中按住Shift键来限制选择范围。拖动选择的单元格或行时&#xff0c;您可以按住Ctrl键来添加或删除单元格或行的选择。当您完成选择时&#x…

ChatGPT最全问答,你想知道的都在这里!

导读&#xff1a;ChatGPT最全问答&#xff0c;你想知道的都在这里&#xff01;本文为你详细解答了ChatGPT是什么、有哪些应用场景、如何更好地向ChatGPT提问以及ChatGPT的进阶技巧&#xff0c;让你轻松成为ChatGPT专家&#xff01; ChatGPT是什么&#xff1f; ChatGPT是一种自然…

简单Demo实现Javaweb的搭建在Tomcat

文章目录 环境准备程序编写 环境准备 本机&#xff1a;MacBook Pro 系统&#xff1a;MacOS 13.4 Tomcat 下载&#xff1a;Apache Tomcat - Welcome! 这里我下载的是9.0.75版本 启动Tomcat容器碰到Bug:Tomcat started.但是就是没法访问到相关页面&#xff0c;同时jps也没有相关…

Java数据驱动:CData JDBC Drivers 2022 Crack

JDBC 驱动程序 易于使用的 JDBC 驱动程序&#xff0c;具有强大的企业级功能 无与伦比的性能和可扩展性。 对实时数据的简单 JDBC/SQL 访问。 从流行的 BI 工具访问实时数据。 集成到流行的 IDE 中。 CData JDBC Drivers Software 是领先的数据访问和连接解决方​​案提供商。我…

附录4-微信开发者工具

目录 1.安装 2 微信开发者工具常用操作 2.1 创建项目 2.2 预览效果 2.3 查看小程序信息 2.4 自定义编译 2.4.1 创建编译模式 2.4.2 使用创建好的编译模式 2.4.3 删除编译模式 1.安装 【微信开发者工具下载】2023年最新官方正式版微信开发者工具免费下载 - 腾…

【企业化部署】Nginx之Rewrite与location的用法

文章目录 前言一、正则表达式1. Nginx 的正则表达式2. 正则表达的优势3. Nginx 使用正则的作用 二、location 的概念1. location 和 rewrite 区别2. location 匹配的分类3. location 常用的匹配规则3.1 location 匹配优先级3.2 location 匹配的实例3.3 实际网站规则定义第一个必…

Netty之EventLoop 解读

是什么 EventLoop &#xff08;事件循环对象&#xff09;本质是一个单线程执行器&#xff08;同时维护了一个 Selector&#xff09;&#xff0c;里面有 run 方法处理 Channel 上源源不断的 io 事件。 它的继承关系比较复杂 一条线是继承自 j.u.c.ScheduledExecutorService 因…

CenterSpace.NMath.Standard.Windows.X64 7.4 Crack

适用于所有 .NET 语言&#xff0c;包括 C#、Visual Basic 和 F#。 CenterSpace Software的NMath TM .NET 数学和统计库为.NET平台上的金融、工程和科学应用程序提供数值组件。 基础 .NET 数学和统计库NMath包括复数类、一般向量和矩阵类、结构化稀疏矩阵类和因式分解、一般稀疏…

华为OD机试真题 Java 实现【找出通过车辆最多颜色】【2023Q1 100分】

一、题目描述 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出n秒内经过的最多颜色的车辆数量。 三种颜色编号为0、1、2。 二、输入描述 第一行输入的是通过的车辆颜色信息 [0 1 1 2] 代表4秒钟通过的车辆颜色分别是0 1…

Rust每日一练(Leetday0020) 最后单词的长度、螺旋矩阵II、排列序列

目录 58. 最后一个单词的长度 Length of Last Word &#x1f31f; 59. 螺旋矩阵 II Spiral Matrix II &#x1f31f;&#x1f31f; 60. 排列序列 Permutation Sequence &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日…