C++核心编程:C++ 中的引用 笔记

2.引用
2.1 引用的基本使用
- 作用:给变量起别名
- 语法:数据类型 &别名 = 原名

在这里插入图片描述

#include<iostream>
using namespace std;
int main() {// 引用基本语法// 数据类型 &别名 = 原名int a = 10;// 创建引用int &ref_a = a;cout<<"a = "<<a<<endl; // 输出10cout<<"ref_a = "<<ref_a<<endl; // 输出10ref_a = 100;cout<<"a = "<<a<<endl; // 输出100cout<<"ref_a = "<<ref_a<<endl; // 输出100return 0;
}

2.2 引用注意事项
- 引用必须初始化
- 引用在初始化后,不能更改

在这里插入图片描述

#include <iostream>
using namespace std;int main() {int a = 10;// 1.引用必须初始化// int &b; // 错误:引用必须初始化int &b = a; // 一旦初始化后,就不可更改cout << "a = " << a << endl; // 10cout << "b = " << b << endl; // 10// 2.引用在初始化后,不可以改变int c = 20;b = c;// 赋值操作,而不是更改引用cout<<"a = "<<a<<endl; // 20cout<<"b = "<<b<<endl; // 20cout<<"c = "<<c<<endl; // 20return 0;
}

2.3 引用做函数参数
- 作用:函数传参时,可以利用引用的技术让形参修饰实参
- 优点:可以简化指针修改实参

#include <iostream>
using namespace std;
// 交换函数
// 1.值传递
void mySwap01(int a,int b) {int temp = a;a = b;b = temp;
}
// 2.地址传递
void mySwap02(int *a,int *b) {int temp = *a;*a = *b;*b = temp;
}// 3.引用传递
void mySwap03(int &a,int &b) {int temp = a;a = b;b = temp;
}int main() {int a = 10;int b = 20;mySwap01(a,b); // 值传递,形参不会修饰实参cout << "a = " << a << endl; // 10cout << "b = " << b << endl; // 20
#if 0mySwap02(&a,&b); // 地址传递,形参会修饰实参cout << "a = " << a << endl; // 20cout << "b = " << b << endl; // 10
#elsemySwap03(a,b); // 引用传递,形参会修饰实参cout << "a = " << a << endl; // 20cout << "b = " << b << endl; // 10
#endifreturn 0;
}

总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更简单清楚

2.4 引用做函数返回值
- 作用:引用做函数返回值
- 用法:函数调用作为左值
- 注意:不要返回局部变量的引用
- 原因:局部变量会在函数调用结束后被销毁,而返回的是引用,所以局部变量被销毁后,返回的引用就是个垃圾值。

-本节课重点:如果函数的返回值是引用,这个函数调用可以作为左值
#include <iostream>
using namespace std;
// 引用做函数的返回值
// 1.不要返回局部变量的引用
int& test01() {int a = 10;//局部变量存放在四区中的 栈区return a;
}// 2.函数的调用可以作为左值
int& test02() {static int a = 10;// 静态变量,存放在全局区,全局区上的数据在程序结束后系统释放return a;
}int main() {// int &ref = test01(); // 错误(非法操作)// cout<<"ref = "<<ref<<endl; // 第一次结果正确,是因为编译器做了保留// cout<<"ref = "<<ref<<endl; // 第二次结果错误,因为a的内存已经释放(非法操作)// 2.函数的调用可以作为左值int &ref2 = test02(); // 正确cout<<"ref2 = "<<ref2<<endl; // 10cout<<"ref2 = "<<ref2<<endl; // 10test02() = 1000;// 如果函数的返回值是引用,这个函数调用可以作为左值cout<<"ref2 = "<<ref2<<endl; // 1000cout<<"ref2 = "<<ref2<<endl; // 1000return 0;
}

2.5 引用的本质
- 本质:引用的本质在C++内部实现是一个指针常量
- 语法:int &ref = a; 引用的语法就是给一个变量起别名
- 特点:
- 起别名:int &ref = a; 相当于*int const ref = &a; 即:ref是一个指针
- 引用的本质就是一个指针常量,引用一旦初始化后,就不可以发生改变

- 注意:对于指针常量而言,指针的指向是不可以修改的,指针指向的值是可以改动的
#include <iostream>
using namespace std;
// 引用的本质// 发现是引用,转换为 int* const ref = &a;
void func(int& ref) { ref = 100; // ref是引用,转换为*ref = 100
}   int main() {int a = 10;// 自动转换为 int* const ref = &a;指针常量是指针指向不可改,也说明引用不可更改int& ref = a;ref = 20;// 内部发现ref是引用,自动帮我们转换为:*ref = 20cout<<"a = "<<a<<endl; // 输出20cout<<"ref = "<<ref<<endl; // 输出20func(a); // 传参时,自动转换为:func(int* const ref = &a);cout<<"a = "<<a<<endl; // 输出100cout<<"ref = "<<ref<<endl; // 输出100return 0;
}

- 结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

在这里插入图片描述

在这里插入图片描述

2.6 常量引用
- 作用:常量引用主要用来修饰形参,防止误操作
- 在函数形参列表中,可以加const修饰形参,防止形参改变实参

#include <iostream>
using namespace std;
// 打印数据函数
void showValue(const int &val) { // val = 200;// 用来修饰形参,防止误操作cout<<"val = " <<val<<endl; 
}
int main() {// 常量引用// 使用场景:用来修饰形参,防止误操作int a = 10;// 引用必须引一块合法的内存空间// int& ref = 10;//error:非常量引用的初始值必须为左值,这个10是一个字面量// 加上const之后,编译器将代码修改 int temp = 10;const int &ref = temp;// 其实现在的这个引用引的是一块临时的空间,但这块空间我们想操作它,你是找不到它的原名的// 而它的原名是编译器帮你写好的.我们只能用这个别名去操作它const int& ref = a;//正确,常量引用可以引用常量// ref = 20;//error:表达式必须是可修改的左值(因为加入const之后变为只读,不可修改)a = 100;showValue(a);return 0;
}

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

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

相关文章

2024017期传足14场胜负前瞻

2024017期赛事由亚洲杯2场、英总杯2场、德甲2场、意甲4场、西甲4场组成。售止时间为1月28日&#xff08;周日&#xff09;19点00分&#xff0c;敬请留意&#xff1a; 本期深盘场次同样适中&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率6场&#xff0c;其他场次基本皆是平…

【鸿蒙】大模型对话应用(一):大模型接口对接与调试

Demo介绍 本demo对接阿里云和百度的大模型API&#xff0c;实现一个简单的对话应用。 DecEco Studio版本&#xff1a;DevEco Studio 3.1.1 Release HarmonyOS API版本&#xff1a;API9 关键点&#xff1a;ArkTS、ArkUI、UIAbility、网络http请求、列表布局 官方接口文档 此…

vue3使用vue-diff插件实现文本对比

前面介绍过vue3通过monaco-editor实现文本对比功能 但因为业务需要自定义左右两侧文本的底色及高亮颜色&#xff0c;考虑换一个插件&#xff1a;vue-diff 1、下载插件&#xff1a; npm i vue-diff1.2.4 2、main.js中引入并注册插件&#xff1a; // Diff对比 import VueDiff f…

ZYNQ AC7020C的“点LED”实验

一、创建 Vivado 工程 1、启动 Vivado 2、在 Vivado 开发环境里点击“Create New Project”&#xff0c;创建一个新的工程 3、弹出一个建立新工程的向导&#xff0c;点击“Next” 4、在弹出的对话框中输入工程名和工程存放的目录。需要注意工程路径“Project location”不能有…

Zookeeper3.5.7基础学习

文章目录 一、Zookeeper入门1、概述2、特点3、数据结构4、应用场景 二、Zookeeper 安装部署1、本地模式安装1.1 基础操作1.2 配置参数解读 2、集群部署2.1 集群安装2.2 选举机制(面试重点)2.3 ZK 集群启动停止脚本 三、ZK客户端相关操作1、客户端命令行操作1.1 命令行语法1.2 z…

【第七在线】数字化转型:智能商品计划管理的核心要素

随着科技的快速发展&#xff0c;数字化转型已经成为企业适应市场变化、提高运营效率的必由之路。尤其在服装行业&#xff0c;快速的市场反应和精准的供应链管理显得尤为重要。其中&#xff0c;智能商品计划管理作为数字化转型的核心要素&#xff0c;正在重塑整个行业的竞争格局…

【RH850U2A芯片】Reset Vector和Interrupt Vector介绍

目录 前言 正文 1. 什么是Reset Vector 1.1 S32K144芯片的Reset Vector 1.2 RH850芯片的Reset Vector 2. 什么是Interrupt Vector 2.1 S32K144芯片的Interrupt Vector 2.2 RH850芯片的Interrupt Vector 3. Reset Vector等价于Interrupt Vector吗 4. 总结 前言 最近在…

$monitor和$strobe都看的是啥

注&#xff1a;本文来自硅芯思见 在编写测试平时&#xff0c;经常会用到$monitor和$strobe监测某些信号&#xff0c;并且使用格式上与$display比较类似&#xff0c;但是它们之间还是存在差异的&#xff0c;它们在当前仿真时间槽&#xff08;time-slot&#xff09;中被执行的区间…

常见电源电路(LDO、非隔离拓扑和隔离拓扑结构)

一、常见电路元件和符号 二、DC-DC转换器 DC-DC转换器&#xff1a;即直流-直流转换器&#xff0c;分为三类&#xff1a;①线性调节器&#xff1b;②电容性开关解调器&#xff1b;③电感性开关调节器&#xff1b; 2.1线性稳压器&#xff08;LDO&#xff09; 2.1.1 NMOS LDO…

如何将前后端分离(vue2+SpringBoot)项目部署到腾讯云服务器

如何将前后端分离&#xff08;vue2SpringBoot&#xff09;项目部署到腾讯云服务器 目录 如何将前后端分离&#xff08;vue2SpringBoot&#xff09;项目部署到腾讯云服务器 1、在选中目录地下新建2个文件夹 2、将打包好的前端项目和后端jar包上传到相应的目录下 3、将路径切…

Gin 应用多实例部署session问题、session参数与刷新

文章目录 一、Gin Session 存储的实现方案二、memstore&#xff1a;基于内存的实现2.1 基本使用2.2 关键参数 三、使用redis&#xff1a;多实例部署3.1 使用redis优势3.2 基本使用 四、信息安全的三个核心概念五、Gin Session 参数5.1 参数介绍 六、Session 自动刷新 一、Gin S…

语图奇缘:林浩然与杨凌芸的哲学漫画大冒险

语图奇缘&#xff1a;林浩然与杨凌芸的哲学漫画大冒险 Language Odyssey: The Philosophical Comic Adventure of Lin Haoran and Yang Lingyun 在一个充满逻辑谜题和言语陷阱的城市——逻言市&#xff0c;住着两位热衷于探索语言奥秘的年轻人&#xff0c;林浩然和杨凌芸。林浩…

一篇文章带你了解C++中隐含的this指针

文章目录 一、this指针的引出二、this指针的特性【面试题】 一、this指针的引出 我们先来定义一个日期类Date&#xff0c;下面这段代码执行的结果是什么呢&#xff1f; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}v…

2024新版68套Axure RP大数据可视化大屏模板及通用组件+PSD源文件

Axure RP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版。新版本相比于V1版内容更加丰富和全面&#xff0c;但依然秉承“敏捷易用”的制作理念&#xff0c;这套作品也同样延续着我们对细节的完美追求&#xff0c;整个设计制作过…

【PythonRS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库&#xff0c;专门用于栅格数据的读写操作。它支持多种栅格数据格式&#xff0c;如GeoTIFF、ENVI和HDF5&#xff0c;为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用&#xff0c;如卫星遥感、地图制作等。通过RasterIO&#xff0c…

Two-factor authentication (2FA) is required for your GitHub account解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

SkyWalking介绍与使用docker-compose部署服务

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等…

gitee仓库使用中的警告

当 Git 执行 git pull 命令时&#xff0c;有时候会出现类似下面的警告信息&#xff1a; warning: ----------------- SECURITY WARNING ---------------- warning: | TLS certificate verification has been disabled! | warning: ------------------------------------------…

网络安全03---Nginx 解析漏洞复现

目录 一、准备环境 二、实验开始 2.1上传压缩包并解压 2.2进入目录&#xff0c;开始制作镜像 2.3可能会受之前环境影响&#xff0c;删除即可 ​编辑 2.4制作成功结果 2.5我们的环境一个nginx一个php 2.6访问漏洞 2.7漏洞触发结果 2.8上传代码不存在漏洞 2.9补充&#…

【蓝桥杯冲冲冲】旅行计划

蓝桥杯备赛 | 洛谷做题打卡day18 文章目录 蓝桥杯备赛 | 洛谷做题打卡day18旅行计划题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 旅行计划 题目描述 Kira酱要去一个国家旅游。这个国家有 N N N 个城市&#xff0c;编号为 1 1 1 至 N N…