资讯·论坛·笑话大全·QQ表情·设为首页
发新话题
打印

[C++] C++下的引用类型

C++下的引用类型

引用类型也称别名,它是个很有趣的东西。在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通常我们使用它是把类对象传递给一个函数。   引用对象采用类型名加上&符号和名称的方式进行定义。例如:(int &test;),这里我们就定义了一个int类型的名为test 的引用,但是int &test;这样的方式是不能够被编译成功的,因为引用的定义必须同时给应用进行赋值操作,这里的赋值并不是说把变量的值传递给引用,而是把引用指向变量,写成这样就对了:(int &test=变量名;)。
8 s9 q2 P3 [9 O2 f5 X我爱电脑技术社区--打造最好的电脑技术自学交流平台#include <iostream>  打造最好的电脑自学交流论坛% V3 l/ R/ `: m& {2 v
using namespace std;  电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站; N7 c+ w, H6 k. s: s
  / N/ X5 _! N& e8 B  s+ u
void main(void)  电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  J5 k* ?  D; s: R7 t3 }, v
{  打造最好的电脑自学交流论坛* D, t7 j, F& B. ?
  
% \9 D( q3 Z. x0 l0 P* Q. H: y/ A我爱电脑技术社区--打造最好的电脑技术自学交流平台int a=10;  
3 h8 y+ S2 N) g6 d) t9 i我爱电脑技术论坛int &test=a;  
4 ^1 R. F- [9 k2 B8 T' c我爱电脑技术社区--打造最好的电脑技术自学交流平台test=test+2;  3 y* x& D( o7 R1 s
  www.520diannao.com# Q0 }2 l" q7 b3 C; d) T. Z
cout << &a << "|" << &test << "|" << a << "|" <<test << endl;  
' o' i8 N" W. Q+ }2 N, U电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  
& [- n  o' F& W- V( {( u我爱电脑技术社区--打造最好的电脑技术自学交流平台cin.get();  打造最好的电脑自学交流论坛9 d! L9 q, l! ^$ Z& b/ F
} 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站# j$ ]. R' Y; y; ?2 {
  观察并编译运行上面的代码你会发现&a和&test的地址显示是相同的,a和test的值显示也是一样的!我爱电脑技术论坛/ _" j  F. Q% ~
  结合前一个教程的内容我们来说一下const引用的相关内容,这里要特别注意,和前一个教程一样带const修饰的引用同样也容易混淆概念!
/ ~# M8 I: ~3 k. @, w( t& X9 Ewww.520diannao.com我爱电脑技术社区--打造最好的电脑技术自学交流平台7 \3 o' n5 i: C) y
  const修饰如果用在引用上会有一个特别之处,它的奥妙就在于可以进行不同类型的对象的初始化,而这一切在普通变量操作上是不可能的下面我们来看一个例子:
6 \9 s6 D! C6 v: M#include <iostream>  www.520diannao.com( f1 H3 m: U6 c9 |8 }+ Y3 ?
using namespace std;  打造最好的电脑自学交流论坛6 m- `; v/ u/ o  X- r
  
4 K  S. H7 ?" y$ ]打造最好的电脑自学交流论坛void main(void)  
  x& S# b' _4 h% F' v) L0 ~5 T. V. K我爱电脑技术论坛{  打造最好的电脑自学交流论坛8 Y& a+ |% H8 c4 v5 ?0 Y) x( @
  打造最好的电脑自学交流论坛7 t- t7 n% [! r
int a=10;  
7 g1 m1 x$ x1 N$ v% L//double &test = a + 1.2f; //这句就是错误的!
8 L1 w; C+ Z9 O6 Y& B! m我爱电脑技术社区--打造最好的电脑技术自学交流平台const double &test = a + 1.2f;  打造最好的电脑自学交流论坛" l% i0 l+ L, [( R  u  x7 E
  
" i) C6 P# Y: t6 Y0 l* y) E我爱电脑技术社区--打造最好的电脑技术自学交流平台cout << &a << "|" << &test << "|" << a << "|" <<test << endl;  电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站3 ]; G2 Y$ x" a; a7 I2 L
  
- G7 q3 f& F8 f3 ?9 X我爱电脑技术论坛cin.get();  
+ o$ q  t- L$ i8 r}
1 A  i$ L4 I0 n. g: a1 a# q3 Q我爱电脑技术社区--打造最好的电脑技术自学交流平台  上面的代码足够说明问题了,这就是const修饰带来的好处,但是聪明的人会在输出的时候发现一个问题,就是a和test的值的输出不同,按照最先说的道理应该可以改变a的值呀,为什么在这里却有没有能够改变呢?
$ X+ k% P0 S- ~' L我爱电脑技术社区--打造最好的电脑技术自学交流平台打造最好的电脑自学交流论坛. q! h9 d( f& ~/ c' S- B; d" P
  道理是这样的,const修饰过后的引用在编译器内部是这样进行变化的。我爱电脑技术论坛* F! z  D) ]7 g3 b
int a=10;  我爱电脑技术论坛3 T, ]8 L3 S4 d: L; V- f/ \3 K- t% t
const double &test = a + 1.2f;打造最好的电脑自学交流论坛3 U# N0 F$ ?3 X! d! z8 w
  这样的一段代码在编译器认为却是下面的方式进行的
: p$ h; z$ V' I4 r打造最好的电脑自学交流论坛int a=10;  
( o: w1 p3 L. ], v0 `打造最好的电脑自学交流论坛int temp = a;  
* k$ X9 f6 P1 ~: O; w' \; Bconst double &test = temp + 12.f
% c1 f- [: E8 R  Q我爱电脑技术论坛  这里其实是把a的值赋给了一个临时temp 变量而后test获得的却是temp+12.f 改变的是temp而不是a,所以就出现了a和test显示的值不同的情况,这里要特别注意,这是一个很容易混淆的地方,在编写程序的时候要特别仔细,以免出现了问题却检查不出为什么!

TOP

发新话题