一、為什么不存在引用的數組
因為數組是存放對象的地方,引用不是一個對象。指針和引用最大的區別就是指針是一個對象,引用不是對象。引用和指針不同。引用只是別名,沒有確定的大小,必須引用一個確定存在的變量。
如果給了一個引用的數組,該如何分配空間呢?指針可以給一個NULL值或者nullptr,但是引用不行。
沒有引用數組的原因
(1)引用數組指的是引用類型的數組,也就是數組的各個成員是引用&類型,這是在c++中不能實現的
(2)c++中,引用可以說只是某個變量的別名,所謂別名,是和指針類型區分開的:指針類型也可以
指向某個變量,但指針類型本身也是一個變量,而引用實際上不是一個變量。更本質來說,可以
理解為引用沒有自身的地址,不占用內存空間(這里為了簡化問題可以這樣考慮)。因此,
聲明引用數組沒有辦法分配空間,因為根本就沒有空間可以分配給引用。所以不能聲明和定義引用數組
(3)C++不支持傳統意義的復制:
傳統的復制為:int a = b;
這里a和b在內存中分別占用不同的內存空間,但是內容一致。
如果int& a = b; 這個時候,內存中a并不被分配內存,所以沒有復制可言。
所以對于數組元素是引用來說,沒法完成元素的復制操作,沒有給數組分配內存,所以數組中的元素不能是引用。
延伸閱讀:
二、數組的引用的作用(存在)
(1)作為形參(防止數組退化為指針)
int func(int array[]);
int func(int array[10]);
int func(int* array);
在func中是無法知道數組的大小,如果開發者必須提前知道數組的大小,就需要用到數組的引用做參數
例如,int(&a)[2],可以有效的防止數組退化。也就是,數組作為函數參數傳遞過去后,仍然是一個數組。
優點:節省內存消耗,不用拷貝一份數組,直接使用原數組(甚至可以修改原數組)
#include
using namespace std;
int func(int(&a)[6])
{
??? int count = 0;
??? for (int i = 0; i < 6; i++)
??? {
?????? count += a[i];
??? }
??? return count;
}
int main()
{
??? int a1[6] = { 1,2,3,4,5,6 };
??? int count = func(a1);
??? cout << “count:” << count << endl;
??? return 0;
}
代碼安全性提高:
如果將 int a1[6] = { 1,2,3,4,5,6 }; 改為 int a1[5] = { 1,2,3,4,5 };
編譯會報錯說明編譯時將進行數組長度的檢查
(2)作為返回類型
函數不能直接返回數組,但是可以返回數組的指針和數組的引用,還需要注意,返回的不能是棧對象,
因為棧對象很快會被銷毀
有關定義:
題目:編寫一個函數的聲明,使其返回包含10個string對象的數組的引用
//不用類型別名
string(&func(形參))[10];
//類型別名
using arr = string[10];
arr& func(形參);
typedef string(&arr)[10];
arr func(形參);
//尾置返回類型
auto func(形參)->string(&)[10];
//decltype關鍵字
string ss[10];
decltype(ss) &func(形參)