C/C++ - Auto Reference
目录
auto
Reference
auto
-
当使用auto关键字声明变量时,C++编译器会根据变量的初始化表达式推断出变量的类型。
-
自动类型推断:auto关键字用于自动推断变量的类型,使得变量的类型可以根据初始化表达式进行推导。
-
初始化表达式:在使用auto声明变量时,必须提供初始化表达式,以便编译器能够推断变量的类型。
-
推断规则:编译器根据初始化表达式的类型来推断变量的类型。推断的结果可以是基本类型、自定义类型、指针类型等。
-
类型一致性:编译器会确保自动推断的类型与初始化表达式的类型一致,以保证类型安全。
-
引用类型推断:当使用auto声明引用变量时,编译器会推断出引用的类型,并创建对应的引用。
#include <iostream>int main() {//类型推断auto a = 1; //intauto b = 'A'; //charauto c = 3.14f; //floatauto d = "Hello World"; //const char*auto e = &a; //int*//编译正确int f = 3.14;//编译错误//int g{3.14};//类型回溯const std::type_info& TypeName = typeid(e);std::cout << TypeName.name() << std::endl;return 0; }
-
Reference
-
引用的基本概念
-
引用是一个已存在变量的别名,通过使用 & 符号进行声明。
-
引用语法格式 -> 类型 & 引用变量名 ( 对象名 ) = 引用实体;
int& ref = a; -
引用在定义时必须初始化
int a = 0; //数据类型& 变量名 = 初始值; //引用必须赋值 int& ref = a; -
引用必须在声明时进行初始化,并且一旦初始化后,它将一直引用相同的对象。
#include <iostream>int main() {//局部变量int a = 2;int b = 5;//引用变量ref1指向变量aint& ref1 = a;//success -> 修改ref1[a] = b//failed -> 修改int& ref1 = b;//引用一旦赋值无法重新引用其他变量ref1 = b;return 0; } -
一个变量可以有多个引用
int a = 0; //一个变量可以有多个引用 int& ref1 = a; int& ref2 = a; -
引用权限(权限只能变小不能扩大)
-
-
引用作为函数参数
-
引用参数使用 & 符号进行声明,表示该参数是一个引用。
void Fun(int& ref/*引用参数*/) {return; } -
引用参数在函数内部直接操作原始变量,而不会创建副本。
#include <iostream>//创建副本 -> 将参数的值PUSH进STACK void Fun2(int a) {}//地址传递 -> 指针 void Fun3(int* p) {}//地址传递 -> 引用 void Fun4(int& ref) {}int main() {int Num = 0;Fun2(Num); //int a = Num;Fun3(&Num); //int* p = &Num;Fun4(Num); //int& ref = Num;return 0; }//Fun2 mov eax,dword ptr [Num] push eax //创建副本 call Fun2 (04113B1h) add esp,4 //Fun3 lea eax,[Num] push eax //地址传递 call Fun3 (04113A7h) add esp,4 //Fun4 lea eax,[Num] push eax //地址传递 call Fun4 (04113B6h) add esp,4 -

-
引用参数可以在函数内部修改原始变量的值。
#include <iostream>//地址传递 -> 引用 void Fun4(int& ref) {//[ref] -> main->Num.Addrref = 2; }int main() {int Num = 0;Fun4(Num); //int& ref = Num;return 0; } -
通过引用传递参数可以实现函数的返回多个值的效果。
#include <iostream>bool cc_OpenFile(const char* szFileName, int& nFileSize) {//TODObool bret = true;if (bret){nFileSize = 123;}return bret; }int main() {int FileSize = 0;bool bret = cc_OpenFile("D:\\1.txt", FileSize);return 0; }
-
-
引用作为函数返回值
-
函数的返回类型可以是引用类型,使用 & 符号进行声明。
//返回值类型为引用 int& Fun() {} -
不应该返回指向局部变量的引用,因为在函数执行完毕后,局部变量会被销毁,引用将变得无效。
#include <iostream>//返回值类型为引用 int& Fun() {//Fun -> STACK -> [EBP - 8]int a = 1;//不要返回局部变量的指针 & 引用//lea eax,[a]return a; }int main() {int& ref = Fun();printf("%d \r\n", ref);printf("%d \r\n", ref);printf("%d \r\n", ref);return 0; } -
返回指向静态变量或全局变量的引用也是不推荐的,因为这样做可能导致函数不可重入和线程安全性问题。
//创建线程 CreateThread;//多线程执行下函数时,可能 void Fun(lpvoid lp) {g_Num++; } -
返回引用可以避免对象的拷贝,提高效率,并允许对返回值进行修改。
-
-
常量引用
-
常量引用声明与初始化
-
常量引用使用 const 关键字进行声明。
-
常量引用必须在声明时被初始化,并且一旦初始化后,就不能再引用其他对象。
-
常量引用可以绑定到常量、非常量和临时对象。
-
常量引用提供了一种只读访问对象的方式,不能通过常量引用修改所引用的对象。
#include <iostream>int main() {int a;const int b = 1;const int& ref1 = a; //绑定非常量const int& ref2 = b; //绑定常量const int& ref3 = 10; //临时对象//引用对象之后无法修改其指向对象//常量引用无法修改其指向对象的值std::cout << ref2 << std::endl;return 0; }
-
-
常量引用与非常量引用的区别
-
常量引用只能用于读取对象的值,而非常量引用可以用于修改对象的值。
-
常量引用可以绑定到常量对象,而非常量引用不能绑定到常量对象。
-
常量引用可以接受临时对象作为参数,而非常量引用不能直接接受临时对象作为参数。
#include <iostream>int main() {int a = 0;const int b = 0;//引用与常量引用一旦绑定对象后均无法修改其指向int& ref1 = a;const int& ref2 = b;//普通引用可以修改其指向对象的值//int* const p = &a; ref1 = 2; //a = 2;//常量引用不可修改其指向对象的值//const int* const p = &a;//b = 2;return 0; }
-
-
常量引用与函数参数
-
将函数参数声明为常量引用可以防止在函数内部意外修改参数的值。
-
如果函数不需要修改参数的值,将其声明为常量引用可以提高代码的清晰度和可读性,并帮助避免潜在的错误。
#include <iostream>void Fun(const int& ref) {std::cout << ref << std::endl; }int main() {int nVer = 2;Fun(nVer);return 0; }
-
-
-
数组引用
#include <iostream>int main() {int Arr[5] = { 0 };//数组引用int (&ref1)[5] = Arr;//定义类型typedef int(ARR_TYPE)[5];ARR_TYPE& ref2 = Arr;//定义类型typedef int(&ARR_REF)[5];ARR_REF ref3 = Arr;return 0; }- 在C++中,可以通过引用来操作数组,这样可以方便地传递和修改数组,而无需进行数组的复制。数组引用在函数参数传递和函数返回值等场景中非常有用。
- 数组引用是对数组的别名,使用引用可以直接操作数组元素。
- 语法:类型 (&引用名)[数组大小] = 数组;
相关文章:
C/C++ - Auto Reference
目录 auto Reference auto 当使用auto关键字声明变量时,C编译器会根据变量的初始化表达式推断出变量的类型。 自动类型推断:auto关键字用于自动推断变量的类型,使得变量的类型可以根据初始化表达式进行推导。 初始化表达式&#x…...
springboot项目快速引入knife4j
引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version> </dependency>knife4j配置文件 basePackage改为自己存放接口的包名 /*** Kn…...
SpringBlade微服务开发平台
采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:BladeToolBladeTool已推送至…...
【运维】Ubuntu18.04系统docker方式安装ElasticSearch和kibana
前言 最近需要搭建一套测试环境,用到了ElasticSearch( 简称es)搜索引擎,安装过程有些曲折,记录下来作为经验。 正文 环境 Ubuntu18.04 操作系统Docker Server Version: 20.10.7ElasticSearch Version: 8.5.3Kibana Version: 8.5.3 说明 E…...
五种单例模式
在整个程序中,保持只有一个实例对象,就是单例模式。 单例模式可以减少构建,GC的次数,提升性能,还能减少堆内存的开销。 1. 懒汉式 在需要使用对象的时候,才进行创建 通过private构造方法,确保…...
【ceph】ceph关于清洗数据scrub的参数分析
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
自然语言NLP学习
2-7 门控循环单元(GRU)_哔哩哔哩_bilibili GRU LSTM 双向RNN CNN 卷积神经网络 输入层 转化为向量表示 dropout ppl 标量 在物理学和数学中,标量(Scalar)是一个只有大小、没有方向的量。它只用一个数值就可以完全…...
js实现填涂画板
文章目录 1实现效果2 实现代码 凑个数,存粹是好玩儿,哈哈... 1实现效果 最上方一栏: 左侧是颜色按钮,点击选中颜色, 中间是功能按钮,重置颜色、清空画板、回退、涂改液(填涂色置为白色ÿ…...
springboot农机电招平台源码和论文
随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单,变高效。…...
TensorFlow 深度学习 开发环境搭建 全教程
PyTorch 深度学习 开发环境搭建 全教程 TensorFlow 深度学习 开发环境搭建 全教程 1、指定清华源命令 -i https://pypi.tuna.tsinghua.edu.cn/simple2、conda安装 这是AI开发环境的全家桶,官网下载链接Anaconda | Start Coding Immediately 尽量不要选择太新版本…...
Qt —— QCharts之曲线示波器(附源码)
示例效果 介绍 Qt5.7 版本后 Qt Charts 的发布。Qt Charts可以创建时尚的、交互式的、以数据为中心的用户界面。Qt Charts使用Qt Charts来简化集成。图表组件可以用作或对象或QML类型。 该类管理不同类型的系列和其他图表相关对象(如图例和轴)的图形表示形式。是一个可以在 .…...
【秒剪】如何更换视频画幅比例以及画面背景?
Step1:点击上方显示的画幅比例 Step2:在下方选择合适的视频画幅或更换画面背景 Step3:点击上方【填充方式】 Step4:选择合适的填充方式即可 Step5:点击这里即可自定义视频背景...
HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化
监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料: 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念,官网有详细说明,再次就不在赘述。博文相关项目…...
mac 安装配置oh-my-zsh
1. 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可 安装完成查看版本 brew -v 2. 安装zsh brew install zsh 查看版本 zsh --version 3. 安装oh-my-zsh github官网链…...
[pytorch入门] 2. tensorboard
tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装,服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…...
基于卡尔曼滤波的平面轨迹优化
文章目录 概要卡尔曼滤波代码主函数代码CMakeLists.txt概要 在进行目标跟踪时,算法实时测量得到的目标平面位置,是具有误差的,连续观测,所形成的轨迹如下图所示,需要对其进行噪声滤除。这篇博客将使用卡尔曼滤波,对轨迹进行优化。 优化的结果为黄色线。 卡尔曼滤波代码…...
GBASE南大通用分享如何更新嵌套的集合
如果您想要更新集合的集合,则必须声明游标来访问外层的集合,然后声明嵌套的游标来 访问内层的集合。 例如,假设 manager 表有一附加的列 scores,它包含一其元素类型为整数的 MULTISET 的 LIST,如下图所示。 更新集合…...
Maya------插入循环边
11.maya 常用建模命令1.插入循环边 多切割_哔哩哔哩_bilibili 与边相对距离 逐渐变化...
Nginx_入门
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 Nginx_入门 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、Nginx概述二、Nginx的应用…...
坚持刷题 | 平衡二叉树
文章目录 题目考察点代码实现实现总结对实现进一步改进扩展提问 坚持刷题,老年痴呆追不上我,今天继续二叉树:平衡二叉树 题目 110.平衡二叉树 考察点 递归能力: 能否使用递归来解决问题。树的基本操作:能否正确地访…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
