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的生存週期是同步的。兩個存在同時銷燬。
我們用一個簡單的例子演示一下。
- #include<stdio.h>
- class test
- {
- int Value;
- public:
- test(int val):Value(val)
- {
- printf("構造函數Value=%d/n",Value);
- };
- ~test()
- {
- printf("析構函數Value=%d/n",Value);
- }
- void print()const
- {
- printf("print/tValue=%d/n",Value);
- }
- };
- int main()
- {
- printf("begin/n");
- const test& obj = 2;//也可以寫成 const test& obj = test(2);
- obj.print();
- printf("end/n");
- return 0;
- }
結果如下
begin
構造函數Value=2
print Value=2
end
析構函數Value=2
是不是const&很特別的呢;