日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++的一般引用及其数组引用

發(fā)布時(shí)間:2023/12/10 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++的一般引用及其数组引用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引用就是某一變量(目標(biāo))的一個(gè)別名,對(duì)引用的操作與對(duì)變量直接操作完全一樣。

引用的聲明方法:類型標(biāo)識(shí)符 &引用名=目標(biāo)變量名;

【例1】:int a; int &ra=a; //定義引用ra,它是變量a的引用,即別名

說(shuō)明:

(1)&在此不是求地址運(yùn)算,而是起標(biāo)識(shí)作用。

(2)類型標(biāo)識(shí)符是指目標(biāo)變量的類型。

(3)聲明引用時(shí),必須同時(shí)對(duì)其進(jìn)行初始化。

(4)引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,且不能再把該引用名作為其他變量名的別名。

ra=1; 等價(jià)于 a=1;

(5)聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。故:對(duì)引用求地址,就是對(duì)目標(biāo)變量求地址。&ra與&a相等。

(6)不能建立數(shù)組的引用。因?yàn)閿?shù)組是一個(gè)由若干個(gè)元素所組成的集合,所以無(wú)法建立一個(gè)數(shù)組的別名。
用(reference)是c++的初學(xué)者比較容易迷惑的概念。下面我們比較詳細(xì)地討論引用。

一、引用的概念

引用引入了對(duì)象的一個(gè)同義詞。定義引用的表示方法與定義指針相似,只是用&代替了*。
例如: Point pt1(10,10);
Point &pt2=pt1; 定義了pt2為pt1的引用。通過(guò)這樣的定義,pt1和pt2表示同一對(duì)象。
需要特別強(qiáng)調(diào)的是引用并不產(chǎn)生對(duì)象的副本,僅僅是對(duì)象的同義詞。因此,當(dāng)下面的語(yǔ)句執(zhí)行后:
pt1.offset(2,2);
pt1和pt2都具有(12,12)的值。
引用必須在定義時(shí)馬上被初始化,因?yàn)樗仨毷悄硞€(gè)東西的同義詞。你不能先定義一個(gè)引用后才
初始化它。例如下面語(yǔ)句是非法的:
Point &pt3;
pt3=pt1;
那么既然引用只是某個(gè)東西的同義詞,它有什么用途呢?
下面討論引用的兩個(gè)主要用途:作為函數(shù)參數(shù)以及從函數(shù)中返回左值。

二、引用參數(shù)

1、傳遞可變參數(shù)
傳統(tǒng)的c中,函數(shù)在調(diào)用時(shí)參數(shù)是通過(guò)值來(lái)傳遞的,這就是說(shuō)函數(shù)的參數(shù)不具備返回值的能力。
所以在傳統(tǒng)的c中,如果需要函數(shù)的參數(shù)具有返回值的能力,往往是通過(guò)指針來(lái)實(shí)現(xiàn)的。比如,實(shí)現(xiàn)
兩整數(shù)變量值交換的c程序如下:
void swapint(int *a,int *b)
{
int temp;
temp=*a;
a=*b;
*b=temp;
}

使用引用機(jī)制后,以上程序的c++版本為:
void swapint(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
調(diào)用該函數(shù)的c++方法為:swapint(x,y); c++自動(dòng)把x,y的地址作為參數(shù)傳遞給swapint函數(shù)。

2、給函數(shù)傳遞大型對(duì)象
當(dāng)大型對(duì)象被傳遞給函數(shù)時(shí),使用引用參數(shù)可使參數(shù)傳遞效率得到提高,因?yàn)橐貌⒉划a(chǎn)生對(duì)象的
副本,也就是參數(shù)傳遞時(shí),對(duì)象無(wú)須復(fù)制。下面的例子定義了一個(gè)有限整數(shù)集合的類:
const maxCard=100;
Class Set
{
int elems[maxCard]; // 集和中的元素,maxCard 表示集合中元素個(gè)數(shù)的最大值。
int card; // 集合中元素的個(gè)數(shù)。
public:
Set () {card=0;} //構(gòu)造函數(shù)
friend Set operator * (Set ,Set ) ; //重載運(yùn)算符號(hào)*,用于計(jì)算集合的交集 用對(duì)象作為傳值參數(shù)
// friend Set operator * (Set & ,Set & ) 重載運(yùn)算符號(hào)*,用于計(jì)算集合的交集 用對(duì)象的引用作為傳值參數(shù)
...
}
先考慮集合交集的實(shí)現(xiàn)
Set operator *( Set Set1,Set Set2)
{
Set res;
for(int i=0;i<Set1.card;++i)
for(int j=0;j>Set2.card;++j)
if(Set1.elems[i]==Set2.elems[j])
{
res.elems[res.card++]=Set1.elems[i];
break;
}
return res;
}
由于重載運(yùn)算符不能對(duì)指針單獨(dú)操作,我們必須把運(yùn)算數(shù)聲明為 Set 類型而不是 Set * 。
每次使用*做交集運(yùn)算時(shí),整個(gè)集合都被復(fù)制,這樣效率很低。我們可以用引用來(lái)避免這種情況。
Set operator *( Set &Set1,Set &Set2)
{ Set res;
for(int i=0;i<Set1.card;++i)
for(int j=0;j>Set2.card;++j)
if(Set1.elems[i]==Set2.elems[j])
{
res.elems[res.card++]=Set1.elems[i];
break;
}
return res;
}

三、引用返回值

如果一個(gè)函數(shù)返回了引用,那么該函數(shù)的調(diào)用也可以被賦值。這里有一函數(shù),它擁有兩個(gè)引用參數(shù)并返回一個(gè)雙精度數(shù)的引用:
double &max(double &d1,double &d2)
{
return d1>d2?d1:d2;
}
由于max()函數(shù)返回一個(gè)對(duì)雙精度數(shù)的引用,那么我們就可以用max() 來(lái)對(duì)其中較大的雙精度數(shù)加1:
max(x,y)+=1.0;

C++數(shù)組引用

1 .在C++中可以定義數(shù)組的引用,用以解決C中無(wú)法解決的“數(shù)組降價(jià)”問(wèn)題,我們先來(lái)看看什么是“數(shù)組降價(jià)”,先看如下代碼:

?…
void Test( char array[20] )
{
???? cout << sizeof(array) << endl; // 輸出 4
}

char array[20] = { 0 };
cout << sizeof(array) << endl; // 輸出 20Test( array );

??? 我們看到,對(duì)于同樣的數(shù)組array,一個(gè)輸出4,另一個(gè)輸出20.這是因?yàn)関oid Test( char array[20] ) 中的array被降階處理了,void Test( char array[20] ) 等同于 void Test( char array[] ) 也等同于void Test( char* const array ) 如果你原意,它甚至等同于void Test( char array[999] )

??? 也就是說(shuō)

?void Test( char array[20] )

{

???? cout << sizeof(array) << endl;
????
}

被降成

void Test( char* const array )

{

???? cout << sizeof(array) << endl; // 既然是char*,當(dāng)然輸出4
????
}

??? 這樣以來(lái),我們?cè)诤瘮?shù)聲明中的數(shù)組大小限制是無(wú)效的,聲明 void Test( char array[20] ) 并不能保證一定會(huì)接收到一個(gè)大小20的數(shù)組,即任何 char[] 都會(huì)被降價(jià)為 char* ,這樣就增加了程序出錯(cuò)的可能性。要解決這樣一個(gè)問(wèn)題,我們可以用C++的數(shù)組引用作為參數(shù),看以下代碼:

?…
void Test( char (&array)[20] )//是不是很像 char *p[20] 和 char (*p)[20] 的區(qū)別?
{
???? cout << sizeof(array) << endl;
}


char array[20] = { 0 };
cout << sizeof(array) << endl;
Test( array );

??? 這樣 Test 函數(shù)就只能接收大小為 20 的 char[],看如下代碼:
?…
char array1[10] = { 0 };
char array2[20] = { 0 };
Test(array1);//Error:實(shí)參不是大小為 10 的 char[]Test(array2);//OK

??? 在 C++ 中,單純的用數(shù)組的引用可以直接傳遞數(shù)組名,因?yàn)樗鼘?shù)組的大小已在形參里提供了信息。但是這樣一來(lái)我們只能固定數(shù)組的大小來(lái)用這個(gè)函數(shù)了。用模板加數(shù)組的引用可以解決這個(gè)問(wèn)題,看如下代碼:
…t
emplate
void Test(int (&array)[sz])
{
??? for (int i = 0; i < sz; ++i)
???????? cout << array[i] << endl;
}int a[2] = { 0 }, b[15] = { 0 };Test(a);//OKTest(b);//OK

??? 只可惜任何事情都不會(huì)太完美,使用模板后確實(shí)可以使同一函數(shù)能夠處理大小不同的數(shù)組了,擴(kuò)大了函數(shù)的適用范圍。但是這樣定義的函數(shù)仍然存在著下述缺點(diǎn):

??? 1. 模板最終是要實(shí)例化的,所以調(diào)用多少個(gè)不同長(zhǎng)度的數(shù)組,就要產(chǎn)生這個(gè)函數(shù)的多少份實(shí)例代碼。而傳統(tǒng)方式的函數(shù)只有一份實(shí)例,與函數(shù)的調(diào)用次數(shù)無(wú)關(guān)。

??? 2. 不能應(yīng)用于在編譯期間數(shù)組的大小尚未確定的情況,這也使這個(gè)模板函數(shù)的適用范圍受到限制。

??? 3. 這樣寫的函數(shù)顯然不能用指針變量作為函數(shù)的參數(shù),因此不能用這個(gè)函數(shù)處理動(dòng)態(tài)分配的內(nèi)存區(qū)域。

總結(jié)

以上是生活随笔為你收集整理的C++的一般引用及其数组引用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。