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