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