C++ 引用! 他是坤坤也是鸡哥
创始人
2024-05-14 11:14:24
0

在这里插入图片描述

  • 👑专栏内容:C++学习笔记
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:日拱一卒,功不唐捐

目录

  • 一、前言
  • 二、引用
    • 1、引用的概念
    • 2、引用的声明
    • 3、引用的特性
      • Ⅰ、 引用在定义时必须初始化
      • Ⅱ、 一个变量可以有多个引用
      • Ⅲ、引用一旦引用一个实体,再不能引用其他实体
    • 4、常引用
  • 三、使用场景
    • 1、做参数
    • 2、做返回值
  • 四、引用和指针的区别
  • 五、总结


一、前言

作为一名 ikun,我最喜欢的明星就是坤坤,但是坤坤又不只叫坤坤,因为他的成名之作《鸡你太美》ikun们就经常亲切的叫他鸡哥

这个过程中,鸡哥就是我们 ikun 给偶像坤坤起的外号。而C++中也有这一功能可以给自己喜欢的变量起外号。下面让我们和坤坤一起,学习C++的引用!

在这里插入图片描述

二、引用

1、引用的概念

引用同样是 C++ 相对于C语言的又一个扩充。引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。引用不是新定义一个变量,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

直接看概念可能有点抽象,我们想一下偶像坤坤被起外号的过程,就能理解了。坤坤又被粉丝们戏称为鸡哥,这里鸡哥就是偶像坤坤的别名,代表的都是坤坤这个人。世界不会因为粉丝们给坤坤起了个别名叫鸡哥,就凭空创造出一个人叫鸡哥。

2、引用的声明

声明方法如下:

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

注意:这里的&符号并不是C语言中的取地址的意思,在C++中&又有引用的意思。
注意:引用类型必须和引用实体是同种类型的。

下面举个例子:

void ikun()
{string kunkun = "我是坤坤";string& jige = kunkun; //给kunkun取个外号叫jigeprintf("kunkun的地址:%p\n", &kunkun);cout << "kunkun的打印:" << kunkun << endl;printf("jige的地址:%p\n", &jige);cout << "jige的打印:" << jige << endl;}
int main()
{ikun();return 0;
}

在这里插入图片描述

3、引用的特性

Ⅰ、 引用在定义时必须初始化

下面本ikun以身试法,写一段没有初始化的引用:

void ikun()
{string kunkun = "我是坤坤";string& jige;cout << "kunkun的打印:" << kunkun << endl;cout << "jige的打印:" << jige << endl;
}

在这里插入图片描述

Ⅱ、 一个变量可以有多个引用

这个理解起来很简单。就像我的偶像坤坤。他在经典歌曲《鸡你太美》中被ikun们称为鸡哥,但是后来,有一拨人喜欢上了他在这个节目中的篮球表演,于是,有人又以蓝球哥称呼他。还有一批人,喜欢上了他的中分发型,于是另外一批人,以中分哥称呼他。

这里的鸡哥、中分哥、篮球哥都是坤坤的外号或者说是坤坤的别名。

C++里面的引用也是一样,你可以给你喜欢的变量取很多的别名。

下面我举个例子:

void ikun()
{string kunkun = "我是坤坤";string& jige = kunkun;string& zhongfen = kunkun;string& lanqiu = kunkun;printf("kunkun的地址  :%p\n", &kunkun);printf("jige的地址    :%p\n", &jige);printf("zhongfen的地址:%p\n", &zhongfen);printf("lanqiu的地址  :%p\n", &lanqiu);
}
int main()
{ikun();return 0;
}

在这里插入图片描述

Ⅲ、引用一旦引用一个实体,再不能引用其他实体

这句话的意思是,我们给一个变量去了外号后,以后这个外号只属于这个变量了,其他变量不能使用这个外号。

就像在我们ikun的眼中,鸡哥就是坤坤的外号,其他人不允许使用鸡哥这个外号!

我们下面看这段代码,有个叫做丽丽的变量,也想和坤坤一样取个外号叫做鸡哥
这当然不会被我们ikun允许,运行一下,看编译器如何暴打丽丽

void ikun()
{string kunkun = "我是坤坤";string lili = "我是丽丽";string& jige = kunkun;string& jige = lili;cout << jige << endl;
}
int main()
{ikun();return 0;
}

在这里插入图片描述

4、常引用

如果在声明引用时用const修饰,被声明的引用就是常引用。
非const的引用只能绑定到普通的对象,而不能绑定到常对象;常引用可以绑定到常对象。一个常引用绑定的无论是普通的对象还是常对象,通过该引用访问的对象只能当做常对象对待,该对象拥有常对象的性质。

错误方式:

void ikun()
{const int is_ikun = 1;int& good = is_ikun;
}

正确方式:

void ikun()
{const int is_ikun = 1;const int& good = is_ikun;
}

在这里插入图片描述

三、使用场景

1、做参数

在定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。如此一来,如果在函数体中修改了形参的数据,那么实参的数据也会被修改,从而拥有“在函数内部影响函数外部数据”的效果。

其实很好理解,我们给坤坤起的外号叫鸡哥,现在我说,让鸡哥去打篮球。去的人自然就是坤坤,看似是让鸡哥去做,其实结果就是坤坤,对鸡哥的改变就是对坤坤的改变。

在这里插入图片描述

像下面这一,利用引用也可以完成“在函数内部影响函数外部数据”的效果。

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

2、做返回值

如下,一个做返回值的小例子:

int &ADD (int r) 
{r += 10;return r;
}

值得注意的是,引用做返回值看似很简单,但是里面有个小坑!!
那就是在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在了。所以,如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
引用返回,如果已经还给系统了,则必须使用传值返回。

此时,一位悲催的程序员再次以身试法,帮助ikun避坑:

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :" << ret << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述

四、引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
但是在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
分析下面的代码:

//引用
int main()
{
int a = 10;
int& ra = a;
cout<<"&a = "<<&a<
//指针
int main()
{
int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 20;
return 0;
}

我们来看下引用和指针的汇编代码对比:
在这里插入图片描述

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求。
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
  4. 没有NULL引用,但有NULL指针。
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

五、总结

在这里插入图片描述
在这里插入图片描述

📢📢📢📢📢📢
💗 你正在阅读 【子夜的星】 的 C++笔记
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中帮我指正吧

相关内容

热门资讯

原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...
树莓派 装 安卓系统,轻松安装... 你有没有想过,用树莓派装上安卓系统,那会是怎样一番景象呢?想象一个迷你电脑,竟然能运行起我们日常使用...
安卓系统怎么打印小票,安卓系统... 你是不是也遇到了这样的烦恼:手机里存了好多重要的小票,但是想打印出来保存或者报销,却发现安卓系统里的...
安卓10安装系统应用,轻松上手... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,今天就来给你支个招——升级安卓1...
美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...