结果为:a=1 b=2因为传递的⽅式为值传递(单向传递);
2、int&;
这⾥的&不是取地址符号,⽽是引⽤符号,引⽤是C++对C的⼀个重要补充。变量的引⽤就是变量的别名,讲的通俗⼀点就是另外⼀个名字,⽐如:“张三这个⼈在家⾥,⽼爸⽼妈叫他三娃⼦,那么这个三娃⼦就是指张三这个⼈,如果叫张三去做某事,就是叫三娃⼦去做某事,这两个名字指的是同⼀个⼈。”同样可以理解如果变量b是变量a的引⽤ 那么⽆论a,b中任何⼀个值改变,另外⼀个也相应的改变,在声明⼀个引⽤时,必须同时使之初始化,即声明它代表哪⼀个变量。请注意:由于引⽤不是独⽴的变量,编译系统不给它单独分配存储单元,因此在建⽴引⽤时只有声明没有定义,只是声明它与原有的某⼀变量的关系。在声明⼀个变量的引⽤后,在本函数执⾏期间,该引⽤⼀直与其代表的变量相联系,不能再作为其他变量的别名。说得简单点:张三和三娃⼦是指同⼀个⼈,不能李四也叫三娃⼦,如果可以这样,叫三娃⼦去做什么,是叫李四呢还是张三呢,这就会乱套了。所以在C++中⼀个引⽤变量只能对应⼀个原始的变量,不能对应两个或多个原始的变量;
下⾯简单说明引⽤:
a)声明引⽤时必须指定它代表的是哪⼀个变量,即对它初始化。
int &a=b;这样是声明a是变量b的引⽤如果是int &a;这样就是错的,没有指定a代表哪⼀个变量。
b)引⽤与其所代表的变量共享同⼀内存单元,系统并不为引⽤另外分配存储单元;
这个应该好理解;就像前⾯所说的,张三和三娃⼦都是同⼀个⼈,三娃⼦只是张三的别名。因此,对于 int &a=b;这个例⼦来说,要输出a和b 的地址,肯定是相同的。
c)怎样区分&是引⽤还是取地址符呢?⽅法是:判断&a这样的形式前是否有类型符即
int &a=b;如果有类型符(int)则是引⽤,否则是取地址运算符。
d)对引⽤的初始化,可以是⼀个变量名,也可以是另⼀个引⽤。
换句话说:张三的别名可以是三娃⼦,三⼩⼦……及其他多个别名⽽三娃⼦也可以有其他的别名,⽐如说:⽼三,⼩三等
⽤程序可以这样:
int a=1; //这⾥是定义⼀个整形变量int &b=a;//声明b是整型变量a的别名int &c=b;//声明c是整型引⽤变量b的别名int &d=a;//声明d是整型变量a的别名
e)引⽤初始化后不能再被重新声明为另⼀变量的别名
即三娃⼦既然是指张三这个⼈,就不能让其他⼈也叫三娃⼦即⼀个别名只能对应⼀个原始变量,但是⼀个原始变量可以有多个别名,⽽且别名也可以由⾃⼰的别名。
3、int & 引⽤的⽤途
C++中增加引⽤主要是作为函数参数,进⾏数据传递的功能;
我们知道如果⽤变量名作为实参,其传递⽅向是单向的,⽽⽤引⽤作为实参其传递⽅向是双向的;也许你会问,在c语⾔中不是有指针吗,⽤指针进⾏参数传递不也是双向的吗?其实其本质上也是值传递,只不过是将变量的地址传给指针,通过指针获取变量的值,这样做虽能得到结果,但通过指针运算符去访问有关变量,⽐较⿇烦。
下⾯分析⼀下使⽤引⽤和使⽤指针变量作为函数形参的不同(以swap函数为例):
1、如果使⽤引⽤,则不必在swap函数设⽴指针变量,指针变量要另外开辟内存单元,其内容是地址。⽽引⽤不是⼀个独⽴的变量,并不占⽤内存单元
2、在main函数中调⽤swap函数时实参不必再变量名前加&以表⽰地址,系统传递的是实参的地址不是实参的值。
3、使⽤指针变量时,为了表⽰指针变量所指向的变量,必须使⽤指针运算符*,⽽使⽤引⽤时,引⽤就代表该变量,不必使⽤指针运算符*;
4、⽤引⽤完成的⼯作,⽤指针也能完成。但引⽤⽐指针的使⽤直观、⽅便,直截了当,不必“兜圈⼦”,容易理解。有些过去只能⽤指针来处理的问题,现在可以⽤引⽤来代替,从⽽降低了程序设计的难度。
4、引⽤的进⼀步说明
1、不能建⽴void类型的引⽤。
因为任何实际存在的变量都是属于⾮void类型的,void的含义是⽆类型或空类型,void只是在语法上相当于⼀个类型⽽已。
2、不能建⽴引⽤的数组。
如:char c[6]=\"hello\"; char &rc=c;//错误
因为数组名是数组⾸元素的地址,本⾝不是⼀个占有存储空间的变量。
3、可以将变量的引⽤的地址赋给⼀个指针,此时指针指向的是原来的变量。
这句话可以这样说:将引⽤变量的地址赋给⼀个指针,此时指针指向的是引⽤变量,相当于指向原来的变量
如:int a=2;
int &b=a;//这个声明语句中的&是⼀个引⽤
int *p=&b;//这个指针初始化语句中的&是取地址运算符 int *p=&b 等价于 int *p=&a;
但是不能定义指向引⽤类型的指针变量,不能写成int & *p=&a;//企图定义指向引⽤类型的指针变量p,错误因为引⽤不是⼀种独⽴的数据类型,因此不能建⽴指向引⽤类型的指针变量。
4、可以建⽴指针变量的引⽤
如:int i=5; int *p=&i;
int * &pt=p;//建⽴指针变量p的引⽤pt
引⽤变量pt代表⼀个int *类型的数据对象(即指针变量)
5、可以⽤const对引⽤加以限定,不允许直接改变该引⽤的值,但是可以改变原变量的值去改变引⽤的值;
如:int i=5;
const int &a=i;
a=3;//错误,因为引⽤a是const int 类型不能直接改变引⽤的值
但是可以修改 i=3; 此时输出i和a都是3:
6、可以⽤常量或表达式对引⽤进⾏初始化,但此时必须⽤const作声明。
如:int i=5;
const int &a=i+1;
此时编译系统是这样处理的:⽣成⼀个临时变量,⽤来存放该表达式的值,引⽤是该临时变量的别名、系统将“const int &a=i+1;”转换为 int temp=i+1;
const int &a=temp;
临时变量是在内部实现的,⽤户不能访问临时变量;⽤这种办法不仅可以⽤表达式对引⽤进⾏初始化,还可以⽤不同类型的变量对之初始化;
double d=3.1415926; const int &a=d;以上等价为:
double d=3.1415926; int temp=d;
const int &a=temp;
如果在上⾯不⽤const则会发⽣错误 double d=3.1415926;
int &a=d;//未加const,错误
为什么?因为如果可以这样做,那么修改引⽤a的值(如a=3.56),则临时变量temp的值也变为3.56,即修改了临时变量temp的值,但不能修改变量d的值,这往往不是⽤户所希望的,即存在⼆义性。与其允许修改引⽤的值⽽不能实现⽤户的⽬的,还不如不允许修改引⽤的值。这就是C++规定对这类引⽤必须加const的原因。