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

C/C++ - Auto Reference

目录

auto

Reference


auto

  • 当使用auto​​关键字声明变量时,C++编译器会根据变量的初始化表达式推断出变量的类型。

    1. 自动类型推断:auto​​关键字用于自动推断变量的类型,使得变量的类型可以根据初始化表达式进行推导。

    2. 初始化表达式:在使用auto​​声明变量时,必须提供初始化表达式,以便编译器能够推断变量的类型。

    3. 推断规则:编译器根据初始化表达式的类型来推断变量的类型。推断的结果可以是基本类型、自定义类型、指针类型等。

    4. 类型一致性:编译器会确保自动推断的类型与初始化表达式的类型一致,以保证类型安全。

    5. 引用类型推断:当使用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​​关键字声明变量时&#xff0c;C编译器会根据变量的初始化表达式推断出变量的类型。 自动类型推断&#xff1a;auto​​关键字用于自动推断变量的类型&#xff0c;使得变量的类型可以根据初始化表达式进行推导。 初始化表达式&#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微服务开发平台

采用前后端分离的模式&#xff0c;前端开源两个框架&#xff1a;Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶&#xff0c;并同时对其基础组件做了高度的封装&#xff0c;单独开源出一个框架&#xff1a;BladeToolBladeTool已推送至…...

【运维】Ubuntu18.04系统docker方式安装ElasticSearch和kibana

前言 最近需要搭建一套测试环境&#xff0c;用到了ElasticSearch( 简称es)搜索引擎&#xff0c;安装过程有些曲折&#xff0c;记录下来作为经验。 正文 环境 Ubuntu18.04 操作系统Docker Server Version: 20.10.7ElasticSearch Version: 8.5.3Kibana Version: 8.5.3 说明 E…...

五种单例模式

在整个程序中&#xff0c;保持只有一个实例对象&#xff0c;就是单例模式。 单例模式可以减少构建&#xff0c;GC的次数&#xff0c;提升性能&#xff0c;还能减少堆内存的开销。 1. 懒汉式 在需要使用对象的时候&#xff0c;才进行创建 通过private构造方法&#xff0c;确保…...

【ceph】ceph关于清洗数据scrub的参数分析

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

自然语言NLP学习

2-7 门控循环单元&#xff08;GRU&#xff09;_哔哩哔哩_bilibili GRU LSTM 双向RNN CNN 卷积神经网络 输入层 转化为向量表示 dropout ppl 标量 在物理学和数学中&#xff0c;标量&#xff08;Scalar&#xff09;是一个只有大小、没有方向的量。它只用一个数值就可以完全…...

js实现填涂画板

文章目录 1实现效果2 实现代码 凑个数&#xff0c;存粹是好玩儿&#xff0c;哈哈... 1实现效果 最上方一栏&#xff1a; 左侧是颜色按钮&#xff0c;点击选中颜色&#xff0c; 中间是功能按钮&#xff0c;重置颜色、清空画板、回退、涂改液&#xff08;填涂色置为白色&#xff…...

springboot农机电招平台源码和论文

随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变高效。…...

TensorFlow 深度学习 开发环境搭建 全教程

PyTorch 深度学习 开发环境搭建 全教程 TensorFlow 深度学习 开发环境搭建 全教程 1、指定清华源命令 -i https://pypi.tuna.tsinghua.edu.cn/simple2、conda安装 这是AI开发环境的全家桶&#xff0c;官网下载链接Anaconda | Start Coding Immediately 尽量不要选择太新版本…...

Qt —— QCharts之曲线示波器(附源码)

示例效果 介绍 Qt5.7 版本后 Qt Charts 的发布。Qt Charts可以创建时尚的、交互式的、以数据为中心的用户界面。Qt Charts使用Qt Charts来简化集成。图表组件可以用作或对象或QML类型。 该类管理不同类型的系列和其他图表相关对象(如图例和轴)的图形表示形式。是一个可以在 .…...

【秒剪】如何更换视频画幅比例以及画面背景?

Step1&#xff1a;点击上方显示的画幅比例 Step2&#xff1a;在下方选择合适的视频画幅或更换画面背景 Step3&#xff1a;点击上方【填充方式】 Step4&#xff1a;选择合适的填充方式即可 Step5&#xff1a;点击这里即可自定义视频背景...

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料&#xff1a; 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念&#xff0c;官网有详细说明&#xff0c;再次就不在赘述。博文相关项目…...

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 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…...

基于卡尔曼滤波的平面轨迹优化

文章目录 概要卡尔曼滤波代码主函数代码CMakeLists.txt概要 在进行目标跟踪时,算法实时测量得到的目标平面位置,是具有误差的,连续观测,所形成的轨迹如下图所示,需要对其进行噪声滤除。这篇博客将使用卡尔曼滤波,对轨迹进行优化。 优化的结果为黄色线。 卡尔曼滤波代码…...

GBASE南大通用分享如何更新嵌套的集合

如果您想要更新集合的集合&#xff0c;则必须声明游标来访问外层的集合&#xff0c;然后声明嵌套的游标来 访问内层的集合。 例如&#xff0c;假设 manager 表有一附加的列 scores&#xff0c;它包含一其元素类型为整数的 MULTISET 的 LIST&#xff0c;如下图所示。 更新集合…...

Maya------插入循环边

11.maya 常用建模命令1.插入循环边 多切割_哔哩哔哩_bilibili 与边相对距离 逐渐变化...

Nginx_入门

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 Nginx_入门 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、Nginx概述二、Nginx的应用…...

坚持刷题 | 平衡二叉树

文章目录 题目考察点代码实现实现总结对实现进一步改进扩展提问 坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天继续二叉树&#xff1a;平衡二叉树 题目 110.平衡二叉树 考察点 递归能力&#xff1a; 能否使用递归来解决问题。树的基本操作&#xff1a;能否正确地访…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...