首页 > 编程语言 >C++ 引用传递 超级详细 小白也行

C++ 引用传递 超级详细 小白也行

时间:2024-03-31 19:30:05浏览次数:164  
标签:10 const 变量 int 超级 C++ 小白 引用 指针

一. 引用的概念

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

例如:就像是给你取小名,本名小名都是你,所有作用也都一样。

  类型& 引用变量名(对象名) = 引用实体(如图下)

注1:千万不要把这个理解成取地址符号,和取地址符号完全不一样。引用的&放在类型名(int)后面,而取地址的&是放在变量前面(例如图中的&a)。

注2:引用类型必须和引用实体是同种类型的。

ps:数组引用和数组指针一样要记得打括号,不然会报错,还有记得写上个数,个数不同也不能引用。

二.引用特性

1. 引用在定义时必须初始化(否则运行报错)

2. 一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体

显然这是改变了值,并不是改变对象;

三.常引用

void TestConstRef()
 {
   const int a = 10;
   //int& ra = a;   // 问题1.该语句编译时会出错,a为常量
   const int& ra = a;
   // int& b = 10;  // 问题2.该语句编译时会出错,b为常量
   const int& b = 10;
   double d = 12.34;
   //int& rd = d;  // 问题3.该语句编译时会出错,类型不同
   const int& rd = d;//那为什么这个可以???
 }

问题1. 10为常量,常量是只能用,但不能改。然后const Int a; 这个加上了const 让变量a也变成只能用 不能改,让a有了常属性,而Int& ra = a ;相当于  Int& ra = 10;这时 Int& 的属性是可以用可以改的,而10不能改,见过 10 = a 吗?一定是没有的叭,所以俩边权限不一样,所以报错。

问题2.同理 ;

问题3.先来看这段代码。

double a = 5.2;
int b = a ;//隐形类型转换

这段代码因为类型不一样,所以a会创建一个临时变量,用这个临时变量去代替a去执行第二条语句;

double d = 12.34;
const int& rd = d;

那现在来看这个为什么可以成功了,d先转换成int 类型的临时变量,第二行左边加是了const也具有常属性,俩边都是Int 只能用不能改类型,所以可以执行成功。

四.使用场景

1. 做参数

引用传递

注:再次强调别理解成取地址啦!

2. 做返回值

先看这一段代码

int& Count()
 {
   static int n = 0;//为什么要加static呢?
   n++;
   // ...
   return n;
 }

来看一下不加static的代码

这为什么ret的值不是3呢??是因为Add(1,2)返回后是这样的int& ret = c ;c和ret共用一块地址,然后Add(1,2)函数使用完这块空间释放了,后续有操作利用这个空间可能会覆盖这个值。

所以加上static让其变成全局变量函数结束时就不会释放该内存,不让其被其他值覆盖。

五.效率性

值返回是引用返回时间的300多倍;为什么呢??是因为值返回和值传递需要拷贝一份,而引用不需要,效率嘎嘎高;

六.引用和指针的区别

1. 引用在定义时必须初始化,指针没有要求。

2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体。

3. 没有NULL引用,但有NULL指针。

4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)

5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。

6. 有多级指针,但是没有多级引用。

7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。

8. 引用比指针使用起来相对更安全。

ps:让我们一起学习C++的知识叭,坚持记录学习的知识。一起加油!!

标签:10,const,变量,int,超级,C++,小白,引用,指针
From: https://blog.csdn.net/rwh04160416/article/details/137037911

相关文章

  • 八股文——TCP四大机制!小白也能懂!(重传机制、滑动窗口、流量控制、拥塞控制)
    引言TCP巨复杂!同时在八股计算机网络中也经常被问到,必须会!这篇文章将让小白有个大体框架,知道怎么个事,面试中可以有话说,也能让佬更加巩固知识点。TCP是一个可靠的传输协议,为了保证它的可靠性,出现七七八八的机制,它可能有数据的破坏、丢包、重复以及分片顺序混乱等问题,TCP通过序......
  • 便民查询 - C++也能写H5应用
    这款应用是我和我的一位粉丝共创,他还在读大二,刚学了C++,他一直都想找个靠谱的项目练练手,刚好我准备做一款便民查询的应用,当然这个应用如果用C++来写后端,会有一种大炮打蚊子的感觉,C++也不适合做APP开发,开发效率和debug容易度都比其他的高级语言差一截。但是由于他想找个项目练手,我......
  • C++ vector
    文章目录vector的介绍vector介绍vector的定义vectoriterator的使用vector空间增长问题vector的增删查改vector的模拟实现创建vector类和成员变量iterator迭代器范围for构造函数赋值、析构空间容量resize和reserve的区别下标操作符重载插入删除交换vector深度剖析v......
  • C++中Switch穿透的妙用
    在C++中,Case穿透(fall-through)指的是在switch语句中,一个case标签没有显式地使用break语句来终止,而是直接执行下一个case标签中的代码。虽然Case穿透在编程中有时会被视为不良实践,因为它可能导致代码的可读性变差和潜在的错误,但有时也可以利用它来实现一些特定的目的。以下是一些利......
  • C++单例类和线程的一个结合
    一个C++的单例类,类里面定义了一个线程对象,线程对象会定时去计算一个时间,并返回这个计算出来的时间。 应用场景:比如,有些比较消耗时间的操作,就可以放在线程里面定时计算,我们在外部定时读取。这样就可以避免主线程被阻塞。 #include<iostream>#include<thread>#incl......
  • 第十四届省赛大学B组(C/C++)接龙数列
    题目链接:接龙数列对于一个长度为 K 的整数数列:A1,A2,...,AK我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1的末位数字(2≤i≤K)。例如 12,23,35,56,61,1112,23,35,56,61,11 是接龙数列;12,23,34,5612,23,34,56 不是接龙数列,因为 56 的首位数字不等于 3......
  • 【每周例题】力扣 C++ 二叉树的最小深度
    二叉树的最小深度题目二叉树的最小深度题目分析1.首先我们可以处理最小深度为0与最小深度为1的情况:最小深度为0:头结点为空;root==nullptr最小深度为1:root->left==nullptr&&root->right==nullptr2.接下来分为左右子树处理,我们可以用递归来计算最小深度3.最后比较左......
  • 【每周例题】力扣 C++ 搜索插入位置
    搜索插入位置题目搜索插入位置 题目分析1.第一个想法肯定是暴力遍历,找到了就输出下标,找不到就对比前后两个数字,寻找合适的位置插入。2.需要注意一点,我们需要再一开始就对比target与数组最后一个数的大小,如果比数组最后一个数大,直接返回数组长度3.第二个想法就是缩短寻找的......
  • 自营小说3.0版推文新玩法、文字一键生成AI漫画视频、实时数据小白当天591.33?
    文字一键生成AI漫画视频、实时数据小白当天591.33?-1-项目简介小说推文是老项目,存在至今,不断有人再做,但是之前的玩法太老套,因为之前都是解压视频,文字需要转换成语音,然后需要去找解压素材,我们需要用剪映再去剪辑,这样一个作品需要30分钟,浪费时间,还不知道有没有效果今天给大......
  • [C++11]右值引用
    阅读导览:通过左值、右值的基础概念来引出左值引用和右值引用知道左值引用和右值引用后,先了解他们为什么能实现(底层原理)熟悉了解左值引用的优点和缺陷并给出疑问,进而引出右值引用出现的意义以及如何解决左值引用的疑问最后从多个方面再次了解右值引用基础概念右值、左值......