【C++】详细了解引用

温馨提示:最近天气降温,同学们注意保暖哦!o(* ̄▽ ̄*)ブ

目录

温馨提示:最近天气降温,同学们注意保暖哦!o(* ̄▽ ̄*)ブ

一、引用的重要性

二、引用的基本用法

1、引用的基本概念

2、引用的语法

3、引用的作用及用法

(1)、用作普通变量的引用

(2)、用作函数参数


一、引用的重要性

引用是C++对c的重要扩充,在C++中有句话叫:能用引用绝不用指针,因为大家也学过C语言了,也知道指针的厉害,各种各样的指针,学起来也很痛苦,因为C++它的核心目的是为了让大家去写代码,所以它就提出了引用的概念,所以在C++中能用引用绝不用指针。除非是必不得以一定要用指针。引用在C++中的重要性也仅次于封装、继承、多态。

二、引用的基本用法

1、引用的基本概念

在C/C++中指针的作用基本都是一样的,但是C++增加了另外一种给函数传递地址的途径,这就是按引用传递,它也存在于其它一些编程语言中,并不是C++发明的。

变量名实质上是一段连续内存空间的别名,是一个标号(门牌号)程序中通过变量来申请并命名内存空间,通过变量的名字可以使用存储空间。

对一段连续的内存空间只能取一个别名吗?比如说如下图所示:

我们定义了一个整型 a,我们是通过变量名a去访问空间,比如说我们将200赋值给a就是往里面写值,如果我去取a,就是去拿a对应的空间内容,变量名a就代表空间内容200,你给它赋值就是写操作,你读值就是读取空间里面的内容。

那么对于一段连续的内存空间,以前都是只取了一个别名,C++增加了引用的概念之后,如上图,我们给那段连续的内存空间取了a这个别名之后我们还可以再给它取个别名num,此时我们给num赋值100,其实就相当于给a赋值100,所以引用的核心目的就是给已有的变量取个别名。

引用是已定义的变量的别名,例如,如果将twain作为clement变量的引用,则可以交替使用twain和clement来表示该变量。

2、引用的语法

①、&和别名 结合 表示引用

②、给某个变量取别名 就定义某个变量

③、从上往下替换

如下给变量num取别名步骤:

Int num = 10;

&a;(①)

Int num;(②)

Int &a;(③)(注意:&就不是取地址了,这个就是单纯的和a结合表示a是一个引用,a是某个变量的别名,就像声明中的char*指的是指向char的指针一样,int &指的是指向int的引用)

因为引用必须初始化,所以最终得到: int &a = num;

注意:

下述语句中的&运算符不是地址运算符,而是将rodents的类型声明为int &,即指向int 变量的引用:

Int & rodents = rats;

但是下述语句中的&运算符是地址运算符,其中&rodent表示rodent引用的变量的地址:

cout<<"rodent address = "<<&rodent<<endl;

3、引用的作用及用法

(1)、用作普通变量的引用

引用变量的主要用途是用作函数的形参,通过将引用变量用作参数,函数将使用原始数据,而不是其副本,这样除指针外,引用也为函数处理大型结构提供了一种非常方便的途径,同时对于设计类来说,引用也是必不可少的。

引用更接近于const指针,必须在创建时进行初始化,一旦与某个变量关联起来之后,就将一直效忠于它,如下:

错误写法:

Int rat;

Int & radent;

Radent = rat;//这样是错误的,必须定义的时候就初始化。

正确写法:

Int rat;

Int & radent = rat;

实际上是下述代码的伪装表示:

Int *const ptr = &rat;

其中,引用radent扮演的角色与表达式*ptr相同

对于习惯了C语言的同学而言,首次接触到引用时可能也会有些困惑,因为这些用户很自然地会想到指针,但他们之间还是有区别的。例如,可以创建指向rats的引用和指针:

Int rats = 10;

Int & rodents = rats;

Int *prats = &rats;

这样,表达式rodents和*prats都可以同rats互换,而表达式&radents和prats都可以同&rats互换。从这一点来说,引用看上去很像伪装表示的指针(其中,*解除引用运算符被隐式理解)。实际上,引用还是不同于指针的。除了表示法不同外,还有其他的差别。例如,差别之一是,必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值还有一个差别是,引用一旦与一个变量关联起来之后将一直效忠于该变量。如下代码可看出:

Int rats = 10;

Int &rodents = rats;

cout<<"rats = "<<rats<<endl;

cout<<"rodents = "<<rodents<<endl;

Int bunnies = 20;

Rodents = bunnies;

cout<<"bunnies = "<<bunnies<<endl;

cout<<"rats = "<<rats<<endl;

cout<<"rodents = "<<rodents<<endl;

打印输出结果:

Rats = 10

Rodents = 10

Bunnies = 20;

Rats = 20;

Rodents = 20;

最初,rodents引用的是rats,但随后程序试图将rodents作为bunnies的引用,乍一看这种意图似乎没啥毛病,因为rodents的值变为了20,但是仔细观察能发现rats的值也变为了20,同时我们还可以打印出他们的地址,可以发现,rats和rodents的地址是相同的,而与bunnies的地址不同,这是由于rodents是rats的别名,因此上述代码中的rodents = bunnies相当于rats = bunnies,也就是说,这相当于我们把bunnies的值赋值给了rats,简而言之,可以通过初始化声明来设置引用,但不能通过赋值来设置。

(2)、用作函数参数

引用经常被用作函数的参数,使得函数中的变量名成为调用程序中的变量名。这种传递参数的方法称为引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。C++新增的这项特性是对C语言的超越,C语言只能按值传递。按值传递导致被调用函数使用调用程序的值的拷贝,当然,C语言也允许避开按值传递的限制,采用按指针传递的方式。

如,我们写一个交换两个变量的值的函数:

swap(int &a,int &b){

Int temp = a;

a = b;

b = temp;

}

此时我们在主函数中调用该函数:

swap(num1,num2);

前面我们说过,我们在定义引用的时候必须同时对其进行初始化,函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的实参,也就是说,上述函数中的ab分别初始化为了num1num2

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钜锋王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值