C++引用介紹

1、什麼是引用?

  某一個變量或者對象的別名,對引用的操作與對其綁定的變量或者對象的操作完全等價。

2、引用的特性

  • 使用&符號,聲明引用型變量。例如:int &b = a;
  • 引用的類型必須和其綁定的變量或者對象的類型相同。
  • 聲明引用的同時必須對其進行初始化
  • 引用是變量或對象的別名,因此不能再將已有的引用名作爲其他變量或對象的名字或別名。
  • 不能返回局部變量的引用。

3、引用是否佔內存?

  引用作爲變量或對象的別名,到底是否會被單獨分配內存呢?下面通過幾個例子來探究一下。
例1
32位執行程序如下:

int a = 10;
int &b = a;
int c = 10;
cout << "&a = " << &a << endl;
cout << "sizeof(a) = " << sizeof(a) << endl;
cout << "&b = " << &b << endl;
cout << "sizeof(b) = " << sizeof(b) << endl;
cout << "&c = " << &c << endl;
cout << "sizeof(c) = " << sizeof(c) << endl;

執行結果如下:

&a = 00B5F9B0
sizeof(a) = 4
&b = 00B5F9B0
sizeof(b) = 4
&c = 00B5F9B4
sizeof(c) = 4

由執行結果可以看出,貌似引用變量b沒有佔用內存。
例2
32位執行程序如下:

int data = 10;
struct A
{
	int &a;
	int b;
	int c;
	A():a(data){}
};
struct B
{
	int b;
	int c;
};
struct A a;
struct B b;
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(B) = " << sizeof(B) << endl;

執行結果如下:

sizeof(A) = 12
sizeof(B) = 8

由此可以看出,結構體A中的引用型成員變量a佔4個字節。
例3
將例2的程序,在64位系統下的執行結果如下:

sizeof(A) = 16
sizeof(B) = 8

由此可以看出,結構體A中引用型成員變量a佔8個字節。

總結:

  • 例1中獲取的引用的地址和其綁定變量的地址一致,實質是因爲C++編譯器的優化,使得我們無法取到引用變量的真正地址。
  • 例2和例3從另一個角度證明,引用變量是佔用內存空間的,且佔用空間的大小和指針一致。

4、引用的本質

  引用在C++中的內部實現是一個**指針常量**。即如下關係成立:

Type & name \Leftrightarrow Type * const name

注意:

  • C++編譯器在編譯過程中使用常指針作爲引用的內部實現,因此引用所佔用的空間大小與指針大小相同
  • 從使用的角度,引用只是一個別名,C++爲了實用性而隱藏了引用的存儲空間這一細節。這也是爲什麼引用和其綁定的變量或對象所指向的地址相同的原因。

下面來詳細介紹一下C++編譯器內部替換引用的過程:

  • 創建一個type* const類型的常指針 b。
  • 將變量的地址賦值給常指針 b。
  • 當C++編譯器發現有操作需要對(引用指針)b進行取值或者賦值操作的時候 ,C++編譯器會默認對b進行一個提領 *b 操作 ——這都是C++編譯器內部行爲(所以C++纔會這麼慢 自己隱形的做了好多操作)。

5、引用的應用

  引用多用於參數傳遞,因爲和指針類似,一般可以節省很多內存空間,提高程序的執行效率,多用於複雜類型變量或對象的傳遞。對於基本類型變量在進行參數傳遞時,除非必要否則沒必要使用引用,因爲每個引用會佔用一個指針大小的空間,這種情況下可能不會起到節省內存目的。

參考鏈接:
https://www.cnblogs.com/yr-linux/p/5522047.html
https://www.cnblogs.com/duwenxing/p/7421100.html

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