C++ 引用

news/2024/4/24 21:06:38/

什么是引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。(语法层面来讲)

但在底层实际上引用是开辟空间的,类似于指针
在这里插入图片描述

使用

  1. 引用做参数
    (输出型参数)
    (减少拷贝提高效率)(大对象/深拷贝类对象)
void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
void swap(int*& a, int*& b)
{int* tmp = a;a = b;b = tmp;
}
int main()
{int x = 11, y = 22;cout << x << " " << y << endl;swap(x, y);cout << x <<" " << y << endl;int* px = &x, * py = &y;cout << px << " " << py << endl;swap(px,py);cout << px << " " << py << endl;return 0;
}
  1. 引用做返回值
    (减少拷贝提高效率)(大对象/深拷贝类对象)
    修改返回值+获取返回值

引用返回被销毁的局部变量n,要小心
在这里插入图片描述

如果函数内部的变量出了函数作用域不消毁,那么就可以使用引用返回
在这里插入图片描述

回顾一下函数栈帧返回值是如何带回main函数的
在这里插入图片描述

把返回值拷贝到寄存器/临时空间带回调用函数中(寄存器放不下时,寄存器大小4byte 8byte)

为什么要开辟临时空间带回呢?
因为函数栈帧要被销毁,即使你销毁前把函数内部变量返回,返回的还是被销毁的变量

发现:静态区的变量带回也要开辟临时空间
在这里插入图片描述
在这里插入图片描述

总结:

1、基本任何场景都可以用引用传参。
2、谨慎用引用做返回值。出了函数作用域,对象不在了,就不能用引用返回,还在就可以用引用返回。

常引用----const修饰变量的引用

引用过程中,权限不能放大

int main()
{const int a = 0;int& b = a;return 0;
}

但权限可以平移或者缩小

int main()
{/*const int a = 0;int& b = a;*/int a = 0;int& b = a;const int& c = b;++a;printf("%d %d %d\n", a, b, c);return 0;
}

算术转换发生时的临时变量

操作符两边不同类型 发生截断或者提升 会保存到临时变量,因为不能改变原数据
在这里插入图片描述
这里虽然int& rii = dd的类型不同
还有另外原因是发生算术转换的临时变量具有常性,相当于权限提升,所以不行

修改:

	double dd = 1.11;int ii = dd;cout << ii << endl;const int& rii = dd;cout << rii << endl;

临时变量具有常性

在这里插入图片描述
临时变量x具有常性 ret1进行权限放大 是不可以的

修改:

int func1()
{static int x = 0;return x;
}int main()
{//int& ret1 = func1();  // 权限放大const int& ret1 = func1(); // 权限平移int ret1 = func1();  // 拷贝return 0;
}

http://www.ppmy.cn/news/48427.html

相关文章

20.上传模块

学习要点&#xff1a; 1.上传模块 本节课我们来开始了解 Layui 的内置模块&#xff1a;上传模块。 一&#xff0e;上传模块 1. 首先&#xff0c;为了课程简洁&#xff0c;我们不考虑服务器设置的真实上传&#xff0c;只讲解前端设置&#xff1b; 2. 真实上传&#xff0c;可以放…

MATLAB | 优化工具箱(optimization toolbox)改版后的live editor工具咋用

优化工具箱(optimization toolbox)改版后的live editor工具咋用&#xff1f;本来是不咋想讲这玩意的&#xff0c;但奈何问的人还不少&#xff0c;这里简单讲一下咋用哈。 很多人下了比较新版本MATLAB就顺手像往常一样点开了优化工具箱&#xff0c;但是熟悉的优化APP界面却并没…

Qt开源项目:校医院远程诊断系统介绍

本人研一参考技术书籍开发的一款Qt程序&#xff0c;两年前已上传到GitHub&#xff0c;有兴趣的同学可以去看看。可能之前上传的项目不够完整&#xff0c;导致有一些同学没有在自己的环境上跑通&#xff0c;所以今天将整个工程都重新上传一遍&#xff0c;包括使用到的opencv的动…

富士康转移3000亿产能,iPhone的印度产能倍增,不再“赏饭吃”

日前消息指今年三月份印度的iPhone产量已经是去年的四倍之多&#xff0c;占比将近7&#xff05;&#xff0c;显示出苹果和富士康都在加速提升印度的iPhone产能&#xff0c;凸显出他们的决心&#xff0c;这对中国制造业将带来深远影响。 一、富士康对中国制造影响巨大 2021年的数…

Huffman 编码

1.Huffman编码 1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概率来构造异字头的平均长度最短的码字&#xff0c;有时称之为最佳编码&#xff0c;一般就叫做Huffman编码(有时也称为霍夫曼编码)。 2.Huffman树 树是一种重要的非线性数据结构&#xff0c;它是数据元…

除了Navicat和DBeaver,还有没有免费又好用的数据库管理工具推荐

最近看到一款数据库Web版工具&#xff0c;SQL Studio&#xff0c;是麦聪软件公司出品的&#xff0c;主打的就是一个&#xff0c;不使用任何的开源代码&#xff0c;产品由中国研发团队100%自主研发。 SQL Studio是一款可创建多个连接的Web版数据库管理开发工具&#xff0c;让你…

企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器

引言 企业工商四要素核验是一种用于验证企业基本信息的方法&#xff0c;主要包括企业名称、社会统一信用代码、法人名称、法人身份证四个要素。这些要素是企业注册时必须提供的信息&#xff0c;通过对这些信息的验证&#xff0c;可以确定企业的真实性和合法性&#xff0c;通常…

leetcode160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

OpenAI-ChatGPT最新官方接口《速率并发限制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(八)(附源码)

Rate limits 速率并发限制 前言Introduction 导言What are rate limits? 什么是速率限制&#xff1f;Why do we have rate limits? 为什么我们有速率限制&#xff1f;What are the rate limits for our API? 我们API的速率限制是什么&#xff1f;GPT-4 rate limits GPT-4速率…

记一次mysql cpu 异常升高100%问题排查

此服务器为一个从库&#xff0c;用于数据的导出业务&#xff0c;服务器配置较低&#xff0c;日常的慢sql也比较多。 上午11点左右cpu异常告警&#xff0c;如下图所示&#xff0c; cpu使用率突增到50%&#xff0c;下午2点左右突增到100% &#xff0c;登录服务器top命令查看cpu升…

计算机系统概述

计算机系统概述 计算机的发展史及未来展望计算机的基本概念及分类计算机的发展简史计算机未来展望 计算机组成结构计算机硬件组成计算机软件系统计算机系统的层次结构 计算机的发展史及未来展望 计算机的基本概念及分类 电子计算机是一种不需要人工直接干预&#xff0c;能够自…

Unity 位运算介绍及使用

介绍 位运算是指对二进制数的位&#xff08;bit&#xff09;进行操作的运算符&#xff0c;可以实现一些高效的逻辑和数学运算。Unity中常用的位运算符有以下几种&#xff1a; 与&#xff08;&&#xff09;&#xff1a;只有两个位都是1&#xff0c;结果才是1&#xff1b; …

基础排序算法【快速排序+优化版本+非递归版本】

基础排序算法【快速排序优化版本非递归版本】&#x1f4af;&#x1f4af;&#x1f4af; ⏰【快速排序】◽1.hoare法◽2.挖坑法◽3.前后指针法◽4.特性总结 ⏰【优化版本】◽1.随机选key◽2.三路取中◽3.小区间优化 ⏰【非递归版本】⏰【测试效率】排序OJ(可使用各种排序跑这个O…

camunda如何监控流程执行

在 Camunda 中&#xff0c;可以使用 Camunda 提供的用户界面和 API 来监控流程的执行情况。以下是几种常用的监控流程执行的方式&#xff1a; 1、使用 Camunda Cockpit&#xff1a;Camunda Cockpit 是 Camunda 官方提供的流程监控和管理工具&#xff0c;可以在浏览器中访问 Co…

Shiro安全框架简介

一、权限管理 1.1 什么是权限管理 基本上只要涉及到用户参数的系统都要进行权限管理&#xff0c;使用权限管理实现了对用户访问系统的控制&#xff0c;不同的用户访问不同的资源。按照安全规则或者安全策略控制用户访问资源&#xff0c;而且只能访问被授权的资源 权限管理包括认…

13.基于双层优化的电动汽车日前-实时两阶段市场竞标

MATLAB代码&#xff1a;基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词&#xff1a;日前-实时市场竞标 电动汽车 双层优化 编程语言&#xff1a;MATLAB平台 内容简介&#xff1a;代码主要做的是电动汽车充电站市场竞标策略&#xff0c;采用双层优化模型对电动汽车…

内网穿透搭建

搭建内网穿透服务器搭建 1.frp frp官网 https://gofrp.org/ 简介 frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 条件 公网服务器&…

Linux网桥简介、入门与配置

开始之前先得介绍一下什么是网桥&#xff0c;这里我们假设大家已经知道了物理的交换机是工作在链路层的。交换机的主要任务是在链路层查找转发表&#xff08;mac地址与端口对应关系表&#xff09;&#xff0c;按照数据帧的目标mac地址&#xff0c;转发数据帧到相应的端口。那么…

4.24、半关闭、端口复用

UNIX网络编程卷1&#xff1a;套接字联网API&#xff08;第3版&#xff09; 等文件(提取码&#xff1a;q99x) 4.24、半关闭、端口复用 1.半关闭2.端口复用 1.半关闭 当 TCP 链接中 A 向 B 发送 FIN 请求关闭&#xff0c;另一端 B 回应 ACK 之后&#xff08;A 端进入 FIN_WAIT_…

Java最新面试题100道,包含答案示例(1-10题)

1. Java 中什么是 JVM&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虚拟机&#xff0c;是一种能够在不同平台上运行 Java 程序的虚拟计算机。JVM 是 Java 的核心组成部分&#xff0c;它负责解释 Java 代码并将其转换成可执行的二进制字节码指令&…