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;其他场次基本皆是平…

【C语言】史上最全printf()和scanf()格式说明

1.printf&#xff08;&#xff09;函数的输出格式详细说明 表1 格式说明符及输出效果 格式说明符 输出效果 %c 一个字符 %d 有符号十进制整数 %f 浮点数&#xff0c;十进制记数法 %e 浮点数,e记数法 %E 浮点数,E记数法 %g 根据数值不同自动选择%f或%e,%e格式在…

后端学习笔记——后端细碎知识点(每天更新......)

细碎知识点 主要是go后端&#xff0c;也会设计到python、java的知识&#xff0c;懒得分类整理&#xff0c;所以都写在一篇文章里面了&#xff0c;方便自己查看笔记。 context.BindJSON获取POST请求中的json数据gin.H封装了生成json的方式 common.ReturnJSONSuccess(c, gin.H{&…

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

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

怎么做深拷贝?

深拷贝是指在拷贝对象时&#xff0c;不仅拷贝了对象本身&#xff0c;还拷贝了对象内部所有的嵌套对象&#xff0c;确保拷贝后的对象与原始对象完全独立&#xff0c;互不影响。在 JavaScript 中&#xff0c;可以通过以下方法来实现深拷贝&#xff1a; 使用 JSON 序列化和反序列化…

JSON详解-使用示例

JSON 概述&#xff1a;JSON全称 JavaScript Object Notation&#xff0c;是一种轻量级的数据交换格式、是一种纯文本。JSON相对于XML来说读写的速度更快。作用&#xff1a; JSON 是用于存储和传输数据的格式JSON 通常用于服务端向网页传递数据 语法规则 数据为 键/值 对&#…

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;中被执行的区间…

字符串函数strncpy、strncat、strncmp的功能(3)

目录 引言&#xff1a; 一、strncpy函数介绍&#xff1a; 1.声明&#xff1a; 2.功能&#xff1a; 3.底层代码&#xff1a; 二、strnact函数介绍&#xff1a; 1.声明&#xff1a; 2.功能&#xff1a; 3.底层代码&#xff1a; 三、strncmp函数介绍&#xff1a; 1.声…

常见电源电路(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;林浩然和杨凌芸。林浩…

Qt的绘制是如何发生的

QEvent::WindowDeactivate 当用户鼠标在应用之外时&#xff0c;会触发QEvent::WindowDeactivate事件&#xff0c; Qt5Widgetsd.dll!QApplication::setActiveWindow(QWidget * act) Line 2072 C Qt5Widgetsd.dll!QApplicationPrivate::notifyActiveWindowChange(QWindo…

一篇文章带你了解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;整个设计制作过…