C++引用(&)詳解-創(chuàng)新互聯(lián)

目錄

目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、泉港網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

一、引用介紹

二、基本引用

三、引用做為參數(shù)

四、常引用

五、引用作為返回值

六、引用和指針的不同點(diǎn)

七、引用總結(jié)


對(duì)于習(xí)慣于使用C語(yǔ)言來(lái)進(jìn)行編寫程序的朋友來(lái)說(shuō),在學(xué)習(xí)C++的過(guò)程當(dāng)中遇見(jiàn)了引用(&)符 號(hào),可能會(huì)有點(diǎn)懵,因?yàn)樵贑語(yǔ)言中的&是取地址符。但是在C++中&有著不一樣的用處,當(dāng)你能夠正確掌握C++的&,它將會(huì)是你在編寫C++程序的道路上的一把提高代碼執(zhí)行效率和增強(qiáng)代碼質(zhì)量的一把利器。

一、引用介紹

? 引用不是新定義的一個(gè)變量,它是給已存在的某個(gè)變量取的別名,編譯器不會(huì)為引用變量開辟空間,它和它所引用的變量共用同一塊內(nèi)存空間。

? 例如:有個(gè)人的名字叫小芳,我們給他取個(gè)名字叫芳芳,則芳芳就是小芳的別名,你叫小芳她會(huì)回應(yīng),當(dāng)然叫芳芳她也會(huì)回應(yīng),實(shí)際上只有一個(gè)小芳,。所以對(duì)引用的操作就是對(duì)它所引用的變量的操作。

二、基本引用

基本格式:類型標(biāo)識(shí)符& 引用名 =?目標(biāo)變量名

#includeusing namespace std;

int main()
{
?? ?int a = 1;
    int e = 2;
?? ?int& b = a;
    int& f;//錯(cuò)誤 未初始化
    int& b = e;//錯(cuò)誤 引用其他實(shí)體

?? ?cout<< "a:address: "<< &a<< endl;//此處&不是引用,是打印a和b的地址
?? ?cout<< "b:address: "<< &b<< endl;//&a == &b說(shuō)明a和b指向的是同一塊內(nèi)存空間

?? ?int& c = b;//引用一個(gè)引用變量,別名的別名
?? ?int& d = c;//其中a,b,c,d全部都指向一個(gè)內(nèi)存空間

?? ?c = 2;//對(duì)其中一個(gè)進(jìn)行操作,則其余的都會(huì)被改變。
?? ?cout<< a<< " "<< b<< " "<< c<< " "<< d<< endl;
?? ?return 0;
}

(1)&在上面的代碼中不是求地址運(yùn)算,而是起到了標(biāo)識(shí)作用。

(2)引用類型必須是和目標(biāo)變量是同一類型的。

(3)引用在聲名時(shí)必須初始化。

(4)一個(gè)變量可以有多個(gè)引用

(5)引用一旦引用了一個(gè)實(shí)體就不能再引用其他實(shí)體(從一而終)。

(6? ?不能建立數(shù)組的引用,因?yàn)閿?shù)組是一個(gè)由若干個(gè)元素所組成的元素集合,所以無(wú)法建立一個(gè)數(shù)組的別名。

三、引用做為參數(shù)

引用的一個(gè)重要作用就是作為函數(shù)的參數(shù),C語(yǔ)言中函數(shù)傳參一般是值傳遞,如果有大的數(shù)據(jù)作為參數(shù)傳遞的時(shí)候,往往采取指針傳遞,因?yàn)檫@樣可以避免較多的數(shù)據(jù)壓棧,可以提高程序的效率。現(xiàn)在C++中也有一種具有同樣效率的方式,就是引用。

下面有幾個(gè)例子用來(lái)區(qū)分

【值傳遞】值傳遞是傳遞了原有對(duì)象的一個(gè)副本,所以調(diào)用函數(shù)可以改變副本的值,但是對(duì)源對(duì)象沒(méi)有任何影響

void Swap(int val1,? int val2)

{

? int tmp = val1;

? val1 = val2;

??val2 = tmp;

}

【引用傳遞】引用傳遞是傳遞了對(duì)象的引用,對(duì)引用的操作會(huì)改變?cè)磳?duì)象本身

void Swap(int& val1,? int& val2)

{

? int tmp = val1;

? val1 = val2;

??val2 = tmp;

}

【指針傳遞】指針傳遞參數(shù)本質(zhì)上是值傳遞的方式,它所傳遞的是一個(gè)地址值,但是地址是唯一的,所以指針可以通過(guò)對(duì)地址的訪問(wèn),進(jìn)而修改其內(nèi)容。

void Swap(int*?pval1,? int*?pval2)

{

? int tmp = *pval1;

? *pval1 = *pval2;

? *pval2 = tmp;

}

如果既要利用引用來(lái)提高程序的效率,又擔(dān)心傳遞給函數(shù)的數(shù)據(jù)在函數(shù)中被改變,我們就可以使用常引用來(lái)解決。

四、常引用

基本格式:const?類型標(biāo)識(shí)符&?引用名?=?目標(biāo)變量

C++中const函數(shù)的定義如下:

const 是 constant 的縮寫,本意是不變的,不易改變的意思。 在 C++ 中是用來(lái)修飾內(nèi)置類型變量,自定義對(duì)象,成員函數(shù),返回值,函數(shù)參數(shù)。 C++ const 允許指定一個(gè)語(yǔ)義約束,編譯器會(huì)強(qiáng)制實(shí)施這個(gè)約束,允許程序員告訴編譯器某值是保持不變的。 如果在編程中確實(shí)有某個(gè)值保持不變,就應(yīng)該明確使用const,這樣可以獲得編譯器的幫助。

所以用這種方式聲明的引用,不能通過(guò)引用對(duì)目標(biāo)變量的值進(jìn)行修改。

voidTest()

{

intd1 = 1;

constint& d2 = d1;

d2 = 2;//錯(cuò)誤,不能給常量賦值。????????

d1 = 2;//d1改變,d2的值也會(huì)改變。

constintd3 = 3;

constint& d4 = d3;

//int& d5 = d3;錯(cuò)誤,只有常引用可以引用常量

constint& d6 = 5;//常量具有常性,只有常引用可以引用常量

doubled7 = 1.1;

int& d8 = d7;//d7是double類型,d8是int,d7賦值給 d8時(shí)要強(qiáng)制類型轉(zhuǎn)換,生成一個(gè)臨時(shí)變量,d8引用的是這個(gè)帶有常性的臨時(shí)變量,所以不能賦值。

?

constint& d9 = d7;//ok

}

下面"hello"串會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象,而在C++中,這些臨時(shí)對(duì)象都是const類型的。因此上面的表達(dá)式就是試圖將一個(gè)const類型的對(duì)象轉(zhuǎn)換為非const類型,這是非法的。

void test(string& s)????????//錯(cuò)誤,常量具有常性,只有常引用可以引用常量

{

? ....;

}

void test(const string& s)????????//正確

{

? ....;

}

int main()

{

? test("hello!");????????

}

???????????????????????????????????????注:引用型參數(shù)在能被定義為const的情況下,盡量定義為const 。

五、引用作為返回值

基本格式:類型標(biāo)識(shí)符 &函數(shù)名(形參列表及類型說(shuō)明)
{函數(shù)體}

引用作為函數(shù)的返回值時(shí),函數(shù)的返回值可以理解為函數(shù)返回了一個(gè)變量(事實(shí)上,函數(shù)返回引用時(shí),它返回的是一個(gè)指向返回值的隱式指針),因此,值為引用的函數(shù)可以用作賦值運(yùn)算符的左操作數(shù)。 另外,用引用返回一個(gè)函... 全局變量,局部靜態(tài)變量,局部動(dòng)態(tài)分配變量都可以作為函數(shù)返回值。

(1)不能返回局部變量的引用。因?yàn)榫植孔兞繒?huì)在函數(shù)返回后被銷毀,因此被返回的引用就成為了"無(wú)所指"的引用,程序會(huì)進(jìn)入未知狀態(tài)。

(2)靜態(tài)變量或者全局變量,可以成為其他引用的初始值。

(3)不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。

(4)可以返回類成員的引用,但最好是const。

int& test1()
{
?int b = 0;
?return b;
}

int& test2()
{
?static?int c?= 1;
?return c;
}

int e = 2;

int main()
{
?int& a?= test1();????????//錯(cuò)誤(1)

??int& d?= test2();? ? ? ? //正確(2)

? int&? f = e;????????????????//正確(2)

??
?cout<< a<< endl;

??cout<< d?<< endl;

??cout<

? cout<

d = 5;

? cout< ?return 0;
}

注:1. 不要返回一個(gè)臨時(shí)變量的引用。

2. 如果返回對(duì)象出了當(dāng)前函數(shù)的作用域依舊存在,則最好使用引用返回,因?yàn)檫@樣更高效。

六、引用和指針的不同點(diǎn)

引用和指針的不同點(diǎn):

1. 引用在定義時(shí)必須初始化,指針沒(méi)有要求

2. 引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型 實(shí)體

3. 沒(méi)有NULL引用,但有NULL指針

4. 在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占 4個(gè)字節(jié))

5. 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小

6. 有多級(jí)指針,但是沒(méi)有多級(jí)引用

7. 訪問(wèn)實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理

8. 引用比指針使用起來(lái)相對(duì)更安全

七、引用總結(jié)

(1)在引用的使用中,單純給某個(gè)變量取個(gè)別名是毫無(wú)意義的,引用的目的主要用于在函數(shù)參數(shù)傳遞中,解決大塊數(shù)據(jù)或?qū)ο蟮膫鬟f效率和空間不如意的問(wèn)題。

(2)用引用傳遞函數(shù)的參數(shù),能保證參數(shù)傳遞中不產(chǎn)生副本,提高傳遞的效率,且通過(guò)const的使用,保證了引用傳遞的安全性。

(3)引用與指針的區(qū)別是,指針通過(guò)某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。

(4)使用引用的時(shí)機(jī)。流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用引用。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:C++引用(&)詳解-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)URL:http://muchs.cn/article40/dddheo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google微信小程序、外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、定制開發(fā)、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化