引用和const引用的區別


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&很特別的呢;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章