引用和const引用的区别

来源:互联网 发布:网页版视频剪辑软件 编辑:程序博客网 时间:2024/05/13 11:41

原帖地址  http://student.csdn.net/space.php?uid=39102&do=blog&id=2271


int& 就是声明一个int的引用类型。
int value;
int& ref = value;
这样就顺利通过编译。如果引用没初始化则编译器拒绝编译过去,知道你引用的是实际存在的变量。

有人会写下这样的代码 int& ref = 1;这时候编译器拒绝了他,因为编译器找不到常量1的地址,于是这时候可以得到一个结论引用的变量必须有一个实际的地址。

在const & 的时候就有差别了
先说一下相似的
int value;
const int & ref = value;
ref = 1;//编译器毫不留情的拒绝此语法。因为ref是const的,不能改写。
但对ref取值的时候则就是value的值。value变ref也跟着变,但不得对ref进行赋值。

接下来就是最大区别的地方了
const int& ref = 1;
编译器接受了这样的语法。这有问题么?没问题,这是一个特别的规定

会这样处理
int no_name_value = 1;
const int& ref = no_name_value;
这跟上面的代码类型,但区别在于no_name_value这个变量你是不能使用的,根本看不到有这个变量的存在。
但确实编译器会这样处理,增加了一个没有任何名字的变量,然后让这个const& 去引用他。
记住最重要的一点,no_name_value和ref的生存周期是同步的。两个存在同时销毁。

我们用一个简单的例子演示一下。


Code:
  1. #include<stdio.h>  
  2. class test  
  3. {  
  4.     int Value;  
  5. public:  
  6.     test(int val):Value(val)  
  7.     {  
  8.         printf("构造函数Value=%d/n",Value);  
  9.     };  
  10.     ~test()  
  11.     {  
  12.         printf("析构函数Value=%d/n",Value);  
  13.     }  
  14.     void print()const  
  15.     {  
  16.         printf("print/tValue=%d/n",Value);  
  17.     }  
  18. };  
  19. int main()  
  20. {  
  21.     printf("begin/n");  
  22.     const test& obj = 2;//也可以写成 const test& obj = test(2);  
  23.     obj.print();  
  24.     printf("end/n");  
  25.     return 0;  
  26. }  

结果如下

begin
构造函数Value=2
print   Value=2
end
析构函数Value=2

是不是const&很特别的呢;

原创粉丝点击