浅谈C++引用的使用以及底层原理

1、引用概念

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

类型& 引用变量名(对象名) =引用实体;

注意:引用类型必须和引用实体同种类型

void TestRef()
{int a = 10;int& ra = a;//<====定义引用类型printf("%p\n", &a);printf("%p\n", &ra);
}
//两者地址一致

2、引用特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{int a = 10;// int& ra;   // 该条语句编译时会出错,因为它未初始化int& ra = a;int& rra = a;printf("%p %p %p\n", &a, &ra, &rra);  
}

3、常引用

意思就是const类型的引用也要const,不能const int 使用int引用。

void TestConstRef()
{const int a = 10;//int& ra = a;   // 该语句编译时会出错,a为常量const int& ra = a;// int& b = 10; // 该语句编译时会出错,b为常量const int& b = 10;double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不同const int& rd = d;
}
int Count()
{int n = 0;n++;return n;
}int main()
{int a = 1;int& b = a;// 指针和引用,赋值/初始化 权限可以缩小,但是不能放大// 权限放大/*const int c = 2;int& d = c;const int* p1 = NULL;int* p2 = p1;*/// 权限保持const int c = 2;const int& d = c;const int* p1 = NULL;const int* p2 = p1;// 权限缩小int x = 1;const int& y = x;int* p3 = NULL;const int* p4 = p3;// 权限只适用于指针和引用,这个是可以的,n和m两个空间是独立的//const int m = 1;//int n = m;const int& ret = Count();//n是临时变量传值返回,不可被修改,加个const才行 //这部分听不懂,以后遇到重新学习  int i = 10;cout << (double)i << endl;double dd = i;const double& rd = i;return 0;
}

4、引用的使用场景

(1)做参数
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
//使用了引用,函数里面改的就是实参,不需要用到取地址再解引用

函数在使用引用时,函数参数是引用int& i,实参也可以使i,因为他们是不同作用域的,可以同名。

形参的改变影响实参。 比如**phead的运用。

(2)做返回值

count 函数调用时,n的返回过程。

第一种是没有static,count的函数栈帧结束后,n的值传给临时变量,这个临时变量是在寄存器或者main函数里面开辟的,此时count函数栈帧被销毁还给操作系统,临时变量再赋值给main函数中的ret。

第二种是有static,其实和第一种差不多,只不过n是放在静态区,n一样要赋值给临时变量。

第三种是传引用返回,直接返回n,而不是传给临时变量。

image-20240310104611202.png

int& Count()
{static int n = 0;n++;// ...return n;
}

下面代码输出什么结果?为什么?

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);//这里的&去掉,ret依然是c的别名,函数结束后c依然还给了操作系统,ret一定是未知,当然有可能对,取决于第一次栈帧销毁时c的值。 Add(3, 4);cout << "Add(1, 2) is :"<< ret <<endl;//7return 0;
}
//上面是c是局部变量,函数结束后还给了操作系统,此时ret是c的引用别名,所以ret的值是未知的。

image-20240309101421894.png

注意:如果函数返回时,出了函数作用域,如果返回对象还在()引用返回,如果已经还给系统了,则必须使用传值返回。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台​,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

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

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

相关文章

华清远见作业第五十三天——ARM(第七天)

代码 key_inc.h #ifndef __KEY_INC_H__ #define __KEY_INC_H__ #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h"void key1_it_config();void key2_it_config(…

【polarctf的部分题解】

【web】phar —》私有属性赋值 当时遇到不知道privated该怎样赋值才可以&#xff0c;链子挺简单的&#xff0c;但是语法不熟悉 <?php include funs.php; highlight_file(__FILE__); if (isset($_GET[file])) {if (myWaf($_GET[file])) {include($_GET[file]);} else {unse…

案例分析:汽车零配件行业CRM解决方案,成功案例揭秘!

近年来&#xff0c;国家大力推动新能源汽车行业发展&#xff0c;在国内汽车工业实现“弯道超车”的同时&#xff0c;新能源汽车出口海外&#xff0c;新市场有望为自主新能源方向贡献增量。 汽车行业的快速发展&#xff0c;势必会带动汽车零配件行业走向增长。从政策方面看&…

牛客网BC-33 统计成绩(数组排序思想)

题目如下 --------------------------------------------------------------------------------------------------------------------------------- 思路&#xff1a;以数组形式输入&#xff0c;并将数组顺序&#xff08;或者逆序&#xff09;排序&#xff0c;最后输出最大值最…

Redis入门到实战-第十二弹

Redis实战热身Bitfields篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

并发编程之Callable、Runnable、Future与FutureTask

目录 前言一、Callable与Runnable1.1 Callable1.2 Runnable1.3 二者对比 二、Future与FutureTask2.1 Future2.2 FutureTask2.3 二者对比 三、综合使用3.1 Callable执行Future获取结果3.2 Callable执行任务FutureTask获取执行结果 四、应用场景 前言 在 Java 中&#xff0c;Cal…

小明SEO:网站域名被投诉怎么恢复呢?分享

小明SEO对他的网站进行了分析&#xff0c;发现网站上存在大量非法内容&#xff0c;比如股票、金融、外汇等&#xff0c;甚至还有虚假宣传来吸引其他网站的流量。 随后他检查了该网站的tdk设置&#xff0c;尤其是网站标题&#xff0c;发现也存在违规行为。 这就是网站域名被投诉…

React Native 应用打包

引言 在将React Native应用上架至App Store时&#xff0c;除了通常的上架流程外&#xff0c;还需考虑一些额外的优化策略。本文将介绍如何通过配置App Transport Security、Release Scheme和启动屏优化技巧来提升React Native应用的上架质量和用户体验。 配置 App Transport…

Python 构建项目工具库之pybuilder使用详解

概要 在Python项目开发中,良好的构建和自动化流程是非常重要的。PyBuilder是一个用于构建Python项目的工具,它提供了简单易用的方式来定义和管理项目的构建过程,包括依赖管理、测试、代码质量检查等。本文将深入探讨PyBuilder库的使用方法、功能特性以及如何利用它来构建优…

SQL映射文件

一、SQL映射的xml文件 1.1 mapper元素 二、select 三、别名与Java映射 四、resultMap 啊

一道很有意思的题目(考初始化)

这题很有意思&#xff0c;需要你对初始化够了解才能解出来 &#xff0c;现在我们来看一下吧。 这题通过分析得出考的是初始化。关于初始化有以下知识点 &#xff08;取自继承与多态&#xff08;继承部分&#xff09;这文章中&#xff09; 所以根据上方那段知识点可知&#xf…

Linux/Backdoor

Backdoor Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和1337端口&#xff0c;端口详细信息如下 22端口对应的是ssh服务&#xff0c;80端口使用Apache&#xff0c;title上写着backdoor&#xff0c;而且可以看出使用了wordpress&#xff0c;1337端口暂时还…

HyperWorks2023 下载地址及安装教程

HyperWorks是一套由Altair Engineering开发的集成化仿真平台。这个平台涵盖了许多不同领域的仿真和优化应用&#xff0c;包括结构分析、流体力学、多体动力学、优化、电磁场分析等。 HyperWorks提供了一系列强大的工具和模块&#xff0c;用于进行复杂的工程仿真和优化任务。它…

数据结构 之 队列习题 力扣oj(附加思路版)

优先级队列 #include<queue> --队列 和 优先级队列的头文件 优先级队列&#xff1a; 堆结构 最大堆 和 最小堆 相关函数&#xff1a; front() 获取第一个元素 back() 获取最后一个元素 push() 放入元素 pop() 弹出第一个元素 size() 计算队列中元素…

简单了解synchronized

什么是synchronized synchronized是Java提供的一个关键字&#xff0c;用于方法或者代码块&#xff0c;保证并发安全。 synchronized使用场景 同步代码块&#xff08;原子性&#xff09; synchronized可以用在方法上&#xff0c;或者用在代码块。 可锁的对象可以是普通对象…

【ZZULI数据结构实验一】多项式的三则运算

【ZZULI数据结构实验一】多项式的四则运算 ♋ 结构设计♋ 方法声明♋ 方法实现&#x1f407; 定义一个多项式类型并初始化---CreateDataList&#x1f407; 增加节点---Getnewnode&#x1f407; 打印多项式类型的数据-- PrintPoly&#x1f407; 单链表的尾插--Listpush_back&…

C++ 优先级与结合性

运算优先级和结合性 表达式有多种运算符混合使用时&#xff0c;求解表达式的值&#xff0c;首先要解决各种运算符的运算优先次序问题。即&#xff0c;优先级和结合性。 例如&#xff1a;下面表达式的值取决于5种运算符的优先次序。 优先级是指不同级别运算符之间的运算次序&am…

卡行领航家用户端是怎么拼团怎么挣钱的?

#领航家代理政策/怎么代理/奖金制度/双2.0模式# 全国V&#xff1a;ok1234vip 领航家用户端&#xff1a;0.52费率 一次拼团0.44费率 两次拼团0.36费率 三次拼团0.2费率 ………… 十次拼团&#xff0c;客户每月挣20480 领航家代理端&#xff1a;无押激活返现高达166/台 分润万5-万…

vue 中实现下载后端返回的流式数据

验证是否是blob /*** Event 验证是否为blob格式* */export async function blobValidate(data) {try {const text await data.text();JSON.parse(text);return false;} catch (error) {return true;}}get请求 /*** Event: get请求下载后端返回的数据流* description: url[Stri…

Flutter 旋转动画 线性变化的旋转动画

直接上代码 图片自己添加一张就好了 import dart:math;import package:flutter/material.dart;import package:flutter/animation.dart;void main() > runApp(MyApp()); //旋转动画 class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {re…