0基础学C++ | 第11天 | 基础知识 | 引用

目录

引用的基本使用

 引用的注意事项

 引用做函数参数

 引用做函数的返回值

引用的本质


引用的基本使用

作用:引用就是给变量起别名,它不是新定义一个变量,而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。我的理解就是在某些场景下它比指针好用。

语法:数据类型& 别名 = 原名;

#include<iostream>
using namespace std;int main()
{int a = 10; //定义各个整型变量int& b = a; //定义个引用cout << "a的值为:" << a << endl; // a的值为10cout << "b的值为:" << b << endl; // b的值为10system("pasue");return 0;  
}

引用的注意事项

1、引用必须初始化

         int &b; //这是不可以的

2、引用初始化后,就不可以更改

        int a = 10;
        int c = 20;
        int& b = a;
        int& b = c; //b引用了a之后,就不能再引用c 不可以再进行更改

3、引用还可以继续有引用

        int a = 10;
        int& b = a;
        int& c = b; //b引用了a, c引用了b

4、一个变量可以有多个引用

        int a = 10;
        int& b = a;
        int& c = a; //b c都引用了a

5、可以对任何类型做引用

​#include<iostream>
using namespace std;int main()
{int a = 10; //定义各个整型变量int &b = a; //必须初始化 ,此时 b 和 a 是相等的共享空间 相当于b就是a的别名(小名)int c = 20; //引用初始化后,不可以更改b = c; //这是复赋值操作,不是更改引用cout << "a的值为:" << a << endl; // a的值为20cout << "b的值为:" << b << endl; // b的值为20cout << "c的值为:" << c << endl; // b的值为20system("pasue");return 0;  
}

引用的两大应用场景(做函数参数、做返回值)

引用的两大应用场景分别是1、做函数参数,2、做返回值

1、做函数参数

引用做函数的参数,作用相当于指针,可以改变变量本身,前面说形参不能修饰实参,但是用指针的时候可以修饰,但是利用指针来传参,还需要解引用,但是采用 引用来传参则不需要这么麻烦,因为传参传一个实参过去,接收时使用引用,此时该引用就是形参的别名,形参的别名改变会改变形参本身。

2、做返回值

用引用接收返回值时,不再需要开辟额外的空间来存函数返回值时产生的临时变量,在main()函数中将临时变量拷贝给接收值。对于像静态变量、全局变量等这些出了作用域不会销毁的对象,就可以使用 传引用返回 ,它不用拷贝,返回的直接就是返回变量的别名,这能够极大地提高效率(目前简单粗暴的理解)

作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修改实参

​​#include<iostream>
using namespace std;//交换函数
int Swap01( int a,int b)
{int temp = a;a = b;b = temp;return 0;
} //1、值传递
int Swap02( int a,int b)
{int temp = a;a = b;b = temp;cout << "Swap02 a的值为:" << a << endl; // a的值为20cout << "Swap02 b的值为:" << b << endl; // b的值为10return 0;
}//2、地址传递
int Swap03( int *a,int *b)
{int temp = *a;*a = *b;*b = temp;cout << "Swap03 a的值为:" << a << endl; // a的值为20cout << "Swap03 b的值为:" << b << endl; // b的值为10return 0;
}//3、引用
int Swap04( int &a,int &b)
{int temp = a;a = b;b = temp;cout << "Swap04 a的值为:" << a << endl; // a的值为20cout << "Swap04 b的值为:" << b << endl; // b的值为10return 0;
}int main()
{int a = 10; int b = 20; Swap01(a,b); //值传递 形参不会修饰实参Swap03(&a,&b); //地址传递 形参会修饰实参Swap04(a,b); //引用传递 形参会修饰实参cout << "a的值为:" << a << endl; // a的值为10cout << "b的值为:" << b << endl; // b的值为20cout << "Swap03 a的值为:" << a << endl; // a的值为20cout << "Swap03 b的值为:" << b << endl; // b的值为10cout << "Swap04 a的值为:" << a << endl; // a的值为20cout << "Swap04 b的值为:" << b << endl; // b的值为10system("pasue");return 0;  
}

引用做函数的返回值

​​#include<iostream>
using namespace std;//引用做函数的返回值
//1、不要返回局部变量的引用
int& test01() // int& 表示a最为一个引用返回
{int a = 10; //局部变量存放在四区中 栈区 执行完就释放掉了return a;
}//2、函数的调用可以作为左值
int& test02()
{static int a = 10;// 加 static 变为静态变量存放在四区中的全局区 执行完整个程序由系统释放掉了return a;}int main()
{int &ref1= test01();int &ref2= test02();cout << "ref1的值为:" << ref1 << endl; // ref1的值为20cout << "ref1的值为:" << ref1 << endl; // 出现错误乱码 因为局部变量 执行完这个代码 空间被释放掉了,第二次输出就会出现错误不一致情况test02()=1000; //作为左值(也就是左边的值)cout << "ref2的值为:" << ref2 << endl; // ref2的值为1000cout << "ref2的值为:" << ref2 << endl; // ref2的值为1000system("pasue");return 0;  
}

引用的本质

本质:应用的本质在C++内部实现是一个指针常量

​​​#include<iostream>
using namespace std;//发现是引用,转化为 int* const ref = &avoid test01(int& ref) 
{ref = 10; //ref是引用,转化为*ref = 10}int main()
{int a = 100;//自动转为为int* const ref = &a,指针常量是指针指向不可改变,所以说为什么引用不可以更改int& ref= a;ref = 20; cout << "a:" << a << endl; cout << "ref:" << ref << endl; test01();system("pasue");return 0;  
}​

关于引用的知识点还没学完,先写到这,感兴趣的可以参考这篇文章C++ 引用(&)的超详细解析(小白必看系列)_c++ &-CSDN博客,虽然写的很详细,对我而言还是有有很多地方需要仔细研究才能懂。

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

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

相关文章

MySql中每行多值属性的计数值

MySql中每行多值属性的计数值 在MySQL中&#xff0c;每行多值属性的计数值指的是在一个表中的某个字段中存储了多个值&#xff0c;而不是单个值。这种情况下&#xff0c;我们需要计算每行中多值属性的数量。 在MySQL中&#xff0c;可以使用内置的函数来计算每行多值属性的计数…

【FFmpeg】avcodec_send_frame函数

目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer&#xff08;encode_send_frame_internal&#xff09;1.1.1 frame的引用函数&#xff08;av_frame_ref &#xff09;1.1.1.1 帧属性的拷贝&#xff08;frame_copy_props&#xff09;1.1.1.2 buffer的引用函数&#xf…

Java框架常见面试题

在Java框架面试中&#xff0c;面试官通常会考察候选人对常见Java框架的理解、使用经验以及解决问题的能力。以下是一些常见的Java框架面试题及其详细回答&#xff1a; 1. Spring框架相关问题 问题&#xff1a;Spring框架的核心组件有哪些&#xff1f;它们各自的作用是什么&am…

Appium 使用隐式等待,无法执行代码怎么办?

简介 添加等待是为了确保自动化脚本在执行过程中与应用程序之间的同步和稳定性。 应用程序的响应时间是不确定的&#xff0c;可能存在网络延迟、加载时间、动画效果等因素。如果在执行自动化脚本时没有适当的等待机制&#xff0c;脚本可能会在应用程序还未完成相应操作或加载完…

转让5000万无区域能源公司要求和流程

国家局的公司&#xff0c;也就是无地域无区域性的公司名称。这样的公司是还可以继续注册的&#xff0c;但是想要拥有国家局无区域的名称就不是那么容易的了。总局的企业要求高&#xff0c;也是实力的体现。对字号有保护。所以有很多人都对无地域的名称一直情有独钟。现有一家名…

【logback-spring配置不生效,开发环境和生产环境配置不同输出级别】

<?xml version"1.0" encoding"UTF-8"?> <configuration debug"false"><!-- ****************************************************************************************** --><!-- ****************************** 本地…

Linux文件夹下所有文件打包

在Linux系统中&#xff0c;可以使用tar命令来打包一个文件夹下的所有文件。以下是一些基本的tar命令用法&#xff1a; 打包文件夹&#xff1a;将指定文件夹及其内容打包成一个.tar文件。 tar -cvf archive_name.tar /path/to/directory-c 表示创建一个新的归档文件。-v 表示在处…

git命令--版本恢复

概述 有两类情形需要做版本恢复。一是整个仓库回退到某一个版本&#xff0c;二是单个文件回退到某一个版本。两者的操作方式是不同的。 操作 整个仓库回退到某一个版本 查看并选取需要回退的commit id git log | less 回退到其中一个版本 git reset --hard [commit_id] 推到…

智能视频监控平台LntonCVS视频监控汇聚平台系统详细介绍

视频监控综合管理平台是专为大中型用户设计的安防管理软件&#xff0c;旨在实现跨区域网络化视频监控的集中管理。该平台集成了信息资源管理、设备管理、用户管理、网络管理和安全管理等多项功能&#xff0c;能够集中管理监控中心的所有视频图像&#xff0c;支持多品牌设备联网…

AI基准测评(下):视频生成、代码能力、逻辑推理,AI是否已经超越人类?

本文作者&#xff1a;王加龙&#xff0c;阿里云高级算法专家 文章推荐 AI实测&#xff5c;基于图像、语言与声音&#xff0c;人工智能是否已经超越了人类&#xff1f; 知乎AI产品“直答”正式上线&#xff01;文心一言4.0 Turbo来袭&#xff0c;可为农民提供专业指导&#x…

MySQL——索引介绍及索引的分类

官方介绍索引是帮助MySQL高效获取数据的数据结构。 提取句子主干&#xff0c;就可以得到索引的本质&#xff1a;索引是数据结构。 索引的分类 在一个表中&#xff0c;主键索引只能有一个&#xff0c;唯一索引可以有多个 主键索引&#xff08;PRIMARY KEY&#xff09;&#xf…

Fork/Join框架

什么是 Fork/Join Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架&#xff0c; 是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 分治 我们再通过 Fork 和 Join 这两个单词来理解下 Fork/Join 框架&#xff0c;F…

数据库设计规范(DOC文件)

1 编写目的 2 数据库策略 2.1 数据库对象长度策略 2.2 数据完整性策略 2.3 规范化设计与性能之间的权衡策略 2.4 字段类型的定义与使用策略 3 命名规范 3.1 数据库命名规则 3.2 数据库对象命名的一般原则 3.3 表空间(Tablespace)命名规则 3.4 表(Table)命名规则 3.5…

人大金仓 PostgreSQL 触发器同步记录数据到另一张表

创建触发器 CREATE TRIGGER sync_tz_ly_event_trigger AFTER INSERT OR UPDATE OR DELETE ON tz_ly_event FOR EACH ROWEXECUTE FUNCTION sync_tz_ly_event_records ( );创建触发函数 CREATE OR REPLACE FUNCTION "sync_tz_ly_event_records"()RETURNS "pg_c…

Java 虚拟机 一

运行时数据区 我们先看线程隔离的数据区 程序计数器 程序计数器&#xff08; Program Counter Register&#xff09; 是一块较小的内存空间&#xff0c; 它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执…

提升用户体验之requestAnimationFrame实现前端动画

1)requestAnimationFrame是什么? 1.MDN官方解释 2.解析这段话&#xff1a; 1、那么浏览器重绘是指什么呢&#xff1f; ——大多数电脑的显示器刷新频率是60Hz&#xff0c;1000ms/6016.66666667ms的时间刷新一次 2、重绘之前调用指定的回调函数更新动画&#xff1f; ——requ…

六西格玛绿带培训ROI:你的投资究竟值不值?

近年来&#xff0c;企业对于员工培训的投入日益增加&#xff0c;六西格玛绿带培训更是作为提升企业运营效率和质量管理的利器&#xff0c;更是备受关注。然而&#xff0c;面对高昂的培训成本&#xff0c;企业如何评估六西格玛绿带培训的投资回报率&#xff08;ROI&#xff09;呢…

安装Intel Realsense D435i驱动与ROS包报错

1.下载安装realsense SDK 1.1 安装依赖 sudo apt install libudev-dev pkg-config libgtk-3-dev sudo apt install libusb-1.0-0-dev pkg-config sudo apt install libglfw3-dev sudo apt install libssl-dev1.2 权限 cd librealsense/ sudo cp config/99-realsense-libusb.…

一万年太久,只争朝夕 | Foundation model的进展仍不够快

编者按&#xff1a;如今根基模型&#xff08;Foundation Models&#xff09;的应用和相关创新正在快速涌现&#xff0c;但仍有很大的提升空间&#xff0c;目前还无法充分发挥根基模型的潜能、将其高效快速地应用于企业级AI应用中。 根基模型的加速应用和落地&#xff0c;带动了…

64、基于去噪卷积神经网络的彩色图像去噪(matlab)

1、基于去噪卷积神经网络的彩色图像去噪的原理及流程 基于去噪卷积神经网络的彩色图像去噪是一种基于深度学习的图像处理技术&#xff0c;可以有效地去除图像中的噪声&#xff0c;提高图像的质量。下面是在Matlab中实现基于去噪卷积神经网络的彩色图像去噪的原理及流程&#x…