我爱电脑技术论坛's Archiver

白雪公主 发表于 2008-6-12 09:09

C++下的引用类型

引用类型也称别名,它是个很有趣的东西。在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通常我们使用它是把类对象传递给一个函数。   引用对象采用类型名加上&符号和名称的方式进行定义。例如:(int &test;),这里我们就定义了一个int类型的名为test 的引用,但是int &test;这样的方式是不能够被编译成功的,因为引用的定义必须同时给应用进行赋值操作,这里的赋值并不是说把变量的值传递给引用,而是把引用指向变量,写成这样就对了:(int &test=变量名;)。
G?7_G.V _ #include <[color=maroon]iostream[/color]>  
4s5f4XRb4k+f&m(i#C [color=blue]using[/color] [color=blue]namespace[/color] std;  
0` {kh Z   
E8TU_v(FEB;b*n [color=blue]void[/color] [color=blue]main[/color]([color=blue]void[/color])  K8?&z6r xdWv'k
{  
K&ZikoH P   
k#Ze{ o0eI}%[ [color=blue]int[/color] a=10;  v,O1AB6|z+Vmo:]?
[color=blue]int[/color] &test=a;  n;r;M7g`sM
test=test+2;  {7A@'n)qk
  
;[8ig1FS F]X [color=maroon]cout[/color] << &a << "|" << &test << "|" << a << "|" <<test << endl;  &[8n^2`d2@@
  
rJ#~FBR]1F [color=maroon]cin[/color].get();  
5v/YB D2O/oc8w } B:c{0x_ Kg
  观察并编译运行上面的代码你会发现&a和&test的地址显示是相同的,a和test的值显示也是一样的!
"}D"`w i2Z   结合[url=http://www.pconline.com.cn/pcedu/empolder/gj/c/0502/561142.html][size=2]前一个教程[/size][/url]的内容我们来说一下const引用的相关内容,这里要特别注意,和前一个教程一样带const修饰的引用同样也容易混淆概念!
1U7ZAdoXo/v!G\
;a:d AK7S   const修饰如果用在引用上会有一个特别之处,它的奥妙就在于可以进行不同类型的对象的初始化,而这一切在普通变量操作上是不可能的下面我们来看一个例子:
'~1a*}*]4ONA #include <[color=maroon]iostream[/color]>  
`jj1@Pi [color=blue]using[/color] [color=blue]namespace[/color] std;   F"p+I3y{
  
0rY-n+f(ld(yp9E [color=blue]void[/color] [color=blue]main[/color]([color=blue]void[/color])  #Vq.I+m)bU2a&Y
{  
%X1{L8b|   
#]6e Qts2k+f [color=blue]int[/color] a=10;  ;e*@%{4T_*hJ6S m
[color=green]//double &test [color=red]=[/color] a [color=red]+[/color] 1.2f; //这句就是错误的! [/color] .ZnpU NX P
[color=blue]const[/color] [color=blue]double[/color] &test [color=red]=[/color] a [color=red]+[/color] 1.2f;  
6V\ ^I!`5R(~`!Z   
*?S)~.g$U9eOY,C2G [color=maroon]cout[/color] << &a << "|" << &test << "|" << a << "|" <<test << endl;  @a"q3C,}MhL`
  8e1IBa+^
[color=maroon]cin[/color].get();  
gWw} L0]6Ad } 5LPke/V ?9|1s
  上面的代码足够说明问题了,这就是const修饰带来的好处,但是聪明的人会在输出的时候发现一个问题,就是a和test的值的输出不同,按照最先说的道理应该可以改变a的值呀,为什么在这里却有没有能够改变呢? {$xEM5x*D8Q
a8Jpx'h't7g*X%M
  道理是这样的,const修饰过后的引用在编译器内部是这样进行变化的。bFV.N(RGmd8\;j&u0K
[color=#0000ff]int[/color] a=10;  2I\'k^t-J6A
[color=blue]const[/color] [color=blue]double[/color] &test [color=red]=[/color] a [color=red]+[/color] 1.2f;
*{#n8}s8u$GU   这样的一段代码在编译器认为却是下面的方式进行的
*c l2x.b9Tf&kX [color=#0000ff]int[/color] a=10;  
N/|h.pl2ygT pAR [color=blue]int[/color] temp [color=red]=[/color] a;  
,KyQ%?0E5gno [color=blue]const[/color] [color=blue]double[/color] &test [color=red]=[/color] temp [color=red]+[/color] 12.f!MzI7Y:G/vi4u[
  这里其实是把a的值赋给了一个[b]临时[/b][color=#ff0000]temp 变量[/color],[color=#ffffff]而后test获得的却是temp+12.f 改变的是temp而不是a[/color],所以就出现了a和test显示的值不同的情况,这里要特别注意,这是一个很容易混淆的地方,在编写程序的时候要特别仔细,以免出现了问题却检查不出为什么!

页: [1]
   

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.