C++相关概念和易错语法(2)(引用、内联函数、auto类型)

1.引用和指针的关系

引用在语法层面上不开辟新的空间,是对变量或别名取别名,我们对别名进行的任何操作也会同样作用于变量本身,这和形参有本质的区别,它的功能更像是指针。事实上,引用底层的实现就是指针,它们没有区别,都会开辟空间。并且它们的效率也完全一致。

在计算char&的大小时,会按照char&指向的对象的大小来计算,因此是1而不是指针的大小。

但是在C++中,引用并没有办法替代指针,因为引用没有办法改变它指向的对象,所以在如p = p->next;等常见的指针操作都没办法使用

指针允许空指针的存在,而引用不存在空引用,指针相对而言更加灵活,引用相对而言更加安全。

但引用的安全并不是绝对的,如果引用的指针存在越界的情况,语法层面也无法检测出来。

2.引用权限放大缩小问题

引用作为一种对变量取别名的用法,对别名和本体的访问权限必须一致,有的情况下比较容易出错。

所有表达式的值都会先存放在一个临时变量里,如果有变量接收就把这个值赋过去,如果没有就抛弃这个值。这个临时变量是只读的,所以如果要对表达式的返回值取别名,只能是只读操作

权限的缩小可行,但不能对只读的别名进行操作

权限的放大,主要是在有const的情况下要注意

注意甄别权限的放大,有的情况下只是赋值操作,不存在放大的情况

3.内联函数的运用

内联函数是C++中对宏函数的一种替换。宏函数的书写过于复杂而且极易出现错误。因此,在代码量少且调用频繁的情况下,使用内联函数是一种更优的选择

swap这个函数在这里就直接被展开了,这样的程序就会省去开辟函数栈帧、销毁栈帧的时间同时内联函数的书写更为直观,宏函数。


但是内联函数(inline)只是对编译器的一个建议,因为如果一个函数有成百上千代码,而这个函数被数百次调用,那么在预处理阶段被展开的代码量是极为恐怖的,所以为了防止这种事情发生,当函数的代码数达到一定级别时,inline就会失效。

这里可以看到,当代码量增加到一定程度,这个内联函数就不会展开,就当成正常函数使用,这个时候的开支也一定是最合理的。

Debug调试设置:

4.auto类型的使用

注意在函数定义时不能使用auto类型,这也是一种规范化的规定,因为如果auto被允许,相当于任何类型的数据都可以作为形参,函数的功能实现也会受到影响。

返回值可用auto

可以对auto进行一些修饰,如auto&,auto*,表示只能推导引用或指针类型。

auto主要的作用是简化长类型,防止使用过于复杂,如函数指针

这里也能看出后面两种写法比第一种更加简洁。

但是auto还是要慎用,因为用多了之后就不清楚对应的变量的类型了。

要查看auto推导的类型,可以使用typeid(a).name(),typeid也是关键字,类似于typedef

5.范围for使用
范围for只能针对数组,指针(包括数组指针)、字符等都不行

表示方式:for (type x : arr)
for(auto x : arr)从前到后遍历数组时自动++,将arr里面的值依次赋给x,因为x是临时变量,所以直接修改x并不会影响数组。要修改x指向的数组的值,可以使用for(auto& x : arr),这相当于对数组里面的内容取别名,再在后面的代码中对x操作就可以影响数组的值
 

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

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

相关文章

毅力流体设备现已加入2024年第13届生物发酵展

参展企业介绍 温州毅力流体设备有限公司位于浙江温州,这里海、陆、空交通网发达,地理位置优越。是一家经浙江-其他工商机关注册、依法经营的法人机构。 温州毅力流体设备有限公司所生产产品包括交通运输,船舶救生设备,空气呼吸器,等等,所生产…

JavaScript中什么叫深拷贝?

在 JavaScript 中,深拷贝指的是创建一个新的对象,这个新的对象与原始对象完全独立,没有任何共享的属性或者数据,它们不共享同一块内存地址。深拷贝会复制原始对象的所有属性和嵌套对象的所有属性,包括嵌套对象中的属性…

C#,简单,精巧,实用的文件夹时间整理工具FolderTime

点击下载本文软件(5积分): https://download.csdn.net/download/beijinghorn/89071073https://download.csdn.net/download/beijinghorn/89071073 百度网盘(不需积分): https://pan.baidu.com/s/1FwCsSz…

数字乡村创新之路:科技引领农村实现高质量发展

随着信息技术的快速发展,数字乡村建设已成为推动农村高质量发展的重要引擎。数字乡村通过科技创新,不仅改变了传统农业生产方式,也提升了乡村治理水平,为农民带来了更加便捷的生活。本文将从数字乡村的内涵、科技引领农村高质量发…

HCIP综合实验

各个路由器配置 R1 配置IP [R1-GigabitEthernet0/0/0]ip add 192.168.1.2 24 [R1-Serial4/0/0]ip add 15.1.1.1 24 配置缺省 [R1]ip route-static 0.0.0.0 0 15.1.1.2 接受认证 [R1-Serial4/0/1]ppp pap local-user tao password cipher tao 配置隧道地址 [R1-Tunnel…

微信怎么恢复好友?7个方法助你轻松寻回失联好友

在数字化社交日益盛行的今天,微信作为我们日常生活中不可或缺的沟通工具,承载着与亲朋好友、同事伙伴之间的深厚情谊。然而,有时由于误操作或其他原因,我们可能会不小心删除了某些重要的微信好友,这时,如何…

python file怎么打开

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。 注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方…

管理科学笔记

1.线性规划 画出区域,代入点计算最大最小值 2.最小生成树 a.断线法,从大的开始断 b.选择法,从小的开始选 3.匈牙利法 维度数量直线覆盖所有的0 4.一直选最当前路线最短路径 5.线性规划 6.决策论

OSError: Can‘t load tokenizer for ‘bert-base-chinese‘

文章目录 OSError: Cant load tokenizer for bert-base-chinese1.问题描述2.解决办法 OSError: Can’t load tokenizer for ‘bert-base-chinese’ 1.问题描述 使用from_pretrained()函数从预训练的权重中加载模型时报错: OSError: Can’t load tokenizer for ‘…

剑指Offer题目笔记24(集合的组合、排序)

面试题79: 问题: ​ 输入一个不含重复数字的数据集合,找出它的所有子集。 解决方案: ​ 使用回溯法。子集就是从一个集合中选出若干元素。如果集合中包含n个元素,那么生成子集可以分为n步,每一步从集合中…

Python控制浏览器——selenium模块

Python控制浏览器——selenium模块 目录 Python控制浏览器——selenium模块准备工作【1】安装selenium【2】安装浏览器驱动【3】测试驱动(作者是Edge) 导航和操作窗口导航返回前进刷新最大化窗口切换选项卡 查找和操作元素8种基本By定位方式[1]ID[2]Name…

ndk ffmpeg

报错: 解决办法: 报错 解决办法:

纯CSS实现未读消息显示99+

在大佬那看到这个小技巧&#xff0c;我觉得这个功能点还挺常用&#xff0c;所以给大家分享下具体的实现。当未读消息数小于100的时候显示准确数值&#xff0c;大于99的时候显示99。 1. 实现效果 2. 组件封装 <template><span class"col"><sup :styl…

【代码】C语言|保留小数点后n位并四舍五入,便于处理运算和存储不善的浮点数

前言 有个人跟我说浮点数运算起来非常麻烦&#xff0c;总是算着算着丢失精度&#xff0c;导致计算结果取int的时候取不准。毕竟系统也没有自动根据这个数的精度四舍五入的功能。 比如int(2.999999999999999)2&#xff0c;但是float(2.999999999999999)3.000000。 我觉得这个问…

关于51单片机TMOD定时器的安全配置

定时器介绍&#xff1a; -------------------------------------------------------------------------------------------------------------------------- 首先配置的是控制寄存器 TCON 说直白点&#xff0c;这个寄存器就是用来计数的&#xff0c;打开计时器&#xff0c;关…

Python-VBA编程500例-029(入门级)

连续字符段索引(Index of Consecutive Character Segments)在实际应用中具有多种场景。常见的应用场景有&#xff1a; 1、文本分析&#xff1a;在文本处理和分析中&#xff0c;连续字符段索引可以用于识别重复的字符序列或模式。这些模式可能对于理解文本的结构、风格或特定含…

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 &#xff08;一&#xff09;随机变量 &#xff08;二&#xff09;全概率公式 &#xff08;三&#xff09;高斯分布及其性质 二、似然是什么&#xff1f; &#xff08;一&#xff09;概率和似然 &#xff08;二&#xff09;极大似然估计 …

Pycharm显示Low memory的解决办法

这种情况该怎么办呢&#xff1f; 按照网上的说法&#xff0c;首先按照下图&#xff0c;选择memory Indicator: 就可以在pycharm的右下角看到内存以及其分配情况&#xff08;allocated表示被分配的&#xff0c;可以看到我的已经被分配完了&#xff0c;应该是这个意思&#xff0…

Matlab|计及需求侧响应日前—日内两阶段鲁棒备用优化

目录 1 主要内容 日前计划模型 日内调整模型 不确定集建模 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《计及需求侧响应日前—日内两阶段鲁棒备用优化》&#xff0c;以6节点系统为例&#xff0c;综合考虑风电出力不确定性与电力设备 N-k强迫停运&…

NASA数据集——包括阿拉斯加的 39 个站点和加拿大西北部的 12 个站点)的季节性沉降、活动层厚度 (ALT)、垂直土壤水分剖面数据

ABoVE: Active Layer Thickness from Airborne L- and P- band SAR, Alaska, 2017, Ver. 3 简介 文件修订日期&#xff1a;2022-09-15 数据集版本: 3 摘要 本数据集以 30 米的分辨率提供了整个 ABoVE 域 51 个站点&#xff08;包括阿拉斯加的 39 个站点和加拿大西北部的 1…