温馨提示:最近天气降温,同学们注意保暖哦!o(* ̄▽ ̄*)ブ
目录
温馨提示:最近天气降温,同学们注意保暖哦!o(* ̄▽ ̄*)ブ
一、引用的重要性
引用是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);
前面我们说过,我们在定义引用的时候必须同时对其进行初始化,函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的实参,也就是说,上述函数中的a和b分别初始化为了num1和num2。