c++ 引用

转载博客:http://blog.csdn.net/cy_weiyi/article/details/46851555

 如: int &ref = num;   就是ref是一个int型的引用。 引用有什么作用呢?  看下面代码就知道了:

 1  #include <iostream>  
 2   
 3 using namespace std;  
 4   
 5   
 6 int main()  
 7 {  
 8   
 9     int num = 12;  
10     int num1 = 21;  
11       
12     int &ref = num;  
13     cout<<"ref = "<<ref<<",num = "<<num<<endl;  
14   
15     num = 16;  
16     cout<<"ref = "<<ref<<",num = "<<num<<endl;  
17       
18     ref = 18;  
19     cout<<"ref = "<<ref<<",num = "<<num<<endl;  
20       
21     cout<<"&ref = "<<&ref<<",&num = "<<&num<<endl;  
22       
23   
24     ref = num1;     /*不是ref成为num1的引用,而是将num1的值传递给ref */  
25     cout<<"ref = "<<ref<<",num1 = "<<num1<<endl;  
26     cout<<"&ref = "<<&ref<<",&num = "<<&num<<",&num1 = "<<&num1<<endl;  
27       
28       
29     return 0;     
30 } 
View Code

 第一行输出 :   ref = 12,num = 12

第二行输出 :   ref = 16,num = 16

第三行输出 :   ref = 18,num = 18

由上面三行输出可以看出引用ref随着num的值的改变而改变,再看下面的输出

第四行输出 :   &ref = 0xbfffeb44,&num = 0xbfffeb44

当取地址符的时候可以看到引用标识符和被引用变量的地址都是同一个;至止明白引用的实质就是给某个变量定义了一个别名,也就是说别引用和引用的变量共用同一块内存空间

下面我们看如果给ref赋值的话会发生什么情况:

第五行输出 :   ref = 21,num = 21

可以看出给ref赋值的同时 ,也改变了被引用的num的值,这里注意的是只把num1的值传给了ref,而不是将ref变成了num1 的引用...通过下面的地址输出结果可以知晓~~

第六行输出 :   &ref = 0xbfffeb44,&num = 0xbfffeb44,&num1 = oxbfffeb40

通过第六行的输出可以知道:引用一旦初始化为某一个变量,那么该引用不可能成为另外变量的引用;
也就是说引用只可以在初始化的时候赋值初始化以后只能发生数值的变化,不能发生源的变化

补充:引用是一个变量,但和普通变量不同的是在定义的时候引用一定要初始化

即不能只定义: int &ref  ;      //不初始化赋值是错误的

 

 

下面给出个例子简单的看下引用应用的例子:

 1  #include <iostream>  
 2   
 3 using namespace std;  
 4   
 5 //使用指针作参数的时候,在函数里进行了一系列的间接运算  
 6 void my_swap(int *n1,int *n2)  
 7 {  
 8     int temp = *n1;  
 9     *n1 = *n2;  
10     *n2 = temp;  
11 }  
12   
13 /*使用引用作参数的时候,在函数中可以直接操作实参的引用,实际上就是操作的实参 
14     所以使用引用作为参数使函数调用更加直接明了简单*/  
15 void my_swap_ref(int &n1,int &n2)  
16 {  
17     int temp = n1;  
18     n1 = n2;  
19     n2 = temp;  
20 }  
21   
22 int main()  
23 {  
24     int num1 = 12;  
25     int num2 = 21;  
26     //在函数调用的时候,如果形式参数是指针类型的,函数调用的时候也要进行一系列的间接运算  
27     my_swap(&num1,&num2);  
28     cout<<"num1 = "<<num1<<",num2 = "<<num2<<endl;  
29       
30     my_swap_ref(num1,num2);  
31     cout<<"num1 = "<<num1<<",num2 = "<<num2<<endl;  
32   
33     return 0;     
34 }
View Code

运行输出结果: num1 = 21;num2 = 12    //指针传递参数

                      num1 = 21;num2 = 12   //引用传递参数

 在这里肯定有人认为这引用跟指针不是一样的么,也是取变量的地址,通过地址来操作地址所指空间的数据么...      下面是引用与指针的四大区别:

 

非空区别

     在任何情况下都不能使用指向空值的引用(继上面引用要初始化...),一个引用必须总是指向某些对象. 不存在批向空值的引用这个事实意味着使用的代码效率要比使用指针搞

 

合法性区别

     在使用引用之前不需要测试他的合法性;相反,指针总是被测试,如:防止其为空等

 

可修改区别

     指针可以被重新赋值以指向另外一个不同的对象;引用则总是指向初始化被指定的对象,以后不能改变,但指定对象的内容可变化

 

应用性区别

      在两种情况下应用指针:一是考虑到存在不指向任何对象的可能; 二是需要在不同的时刻指向不同的对象.如果总是指向一个对象并且一旦指向一个对象 就不会改变指向,应该使用引用...(有点像花花公子跟情圣的区别...)

原文地址:https://www.cnblogs.com/HPAHPA/p/8351542.html