- 👑專欄內(nèi)容:C++學(xué)習筆記
- ?個人主頁:子夜的星的主頁
- 💕座右銘:日拱一卒,功不唐捐
作為一名ikun,我最喜歡的明星就是坤坤,但是坤坤又不只叫坤坤,因為他的成名之作《雞你太美》,ikun們就經(jīng)常親切的叫他雞哥。
這個過程中,雞哥就是我們 ikun 給偶像坤坤起的外號。而C++
中也有這一功能可以給自己喜歡的變量起外號。下面讓我們和坤坤一起,學(xué)習C++
的引用!
引用同樣是C++
相對于C語言
的又一個擴充。引用可以看做是數(shù)據(jù)的一個別名,通過這個別名和原來的名字都能夠找到這份數(shù)據(jù)。引用不是新定義一個變量,編譯器不會為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。
直接看概念可能有點抽象,我們想一下偶像坤坤被起外號的過程,就能理解了。坤坤又被粉絲們戲稱為雞哥,這里雞哥就是偶像坤坤的別名,代表的都是坤坤這個人。世界不會因為粉絲們給坤坤起了個別名叫雞哥,就憑空創(chuàng)造出一個人叫雞哥。
2、引用的聲明聲明方法如下:
類型 & 引用變量名(對象名) = 引用實體;
注意:這里的&
符號并不是C語言中的取地址的意思,在C++中&
又有引用的意思。
注意:引用類型必須和引用實體是同種類型的。
下面舉個例子:
void ikun()
{string kunkun = "我是坤坤";
string& jige = kunkun; //給kunkun取個外號叫jige
printf("kunkun的地址:%p\n", &kunkun);
cout<< "kunkun的打印:"<< kunkun<< endl;
printf("jige的地址:%p\n", &jige);
cout<< "jige的打印:"<< jige<< endl;
}
int main()
{ikun();
return 0;
}
3、引用的特性
Ⅰ、 引用在定義時必須初始化下面本ikun以身試法,寫一段沒有初始化的引用:
void ikun()
{string kunkun = "我是坤坤";
string& jige;
cout<< "kunkun的打印:"<< kunkun<< endl;
cout<< "jige的打印:"<< jige<< endl;
}
Ⅱ、 一個變量可以有多個引用這個理解起來很簡單。就像我的偶像坤坤。他在經(jīng)典歌曲《雞你太美》中被ikun們稱為雞哥,但是后來,有一撥人喜歡上了他在這個節(jié)目中的籃球表演,于是,有人又以藍球哥稱呼他。還有一批人,喜歡上了他的中分發(fā)型,于是另外一批人,以中分哥稱呼他。
這里的雞哥、中分哥、籃球哥都是坤坤的外號或者說是坤坤的別名。
C++里面的引用也是一樣,你可以給你喜歡的變量取很多的別名。
下面我舉個例子:
void ikun()
{string kunkun = "我是坤坤";
string& jige = kunkun;
string& zhongfen = kunkun;
string& lanqiu = kunkun;
printf("kunkun的地址 :%p\n", &kunkun);
printf("jige的地址 :%p\n", &jige);
printf("zhongfen的地址:%p\n", &zhongfen);
printf("lanqiu的地址 :%p\n", &lanqiu);
}
int main()
{ikun();
return 0;
}
Ⅲ、引用一旦引用一個實體,再不能引用其他實體這句話的意思是,我們給一個變量去了外號后,以后這個外號只屬于這個變量了,其他變量不能使用這個外號。
就像在我們ikun的眼中,雞哥就是坤坤的外號,其他人不允許使用雞哥這個外號!
我們下面看這段代碼,有個叫做麗麗的變量,也想和坤坤一樣取個外號叫做雞哥。
這當然不會被我們ikun允許,運行一下,看編譯器如何暴打麗麗!
void ikun()
{string kunkun = "我是坤坤";
string lili = "我是麗麗";
string& jige = kunkun;
string& jige = lili;
cout<< jige<< endl;
}
int main()
{ikun();
return 0;
}
4、常引用如果在聲明引用時用const
修飾,被聲明的引用就是常引用。
非const的引用只能綁定到普通的對象,而不能綁定到常對象;常引用可以綁定到常對象。一個常引用綁定的無論是普通的對象還是常對象,通過該引用訪問的對象只能當做常對象對待,該對象擁有常對象的性質(zhì)。
錯誤方式:
void ikun()
{const int is_ikun = 1;
int& good = is_ikun;
}
正確方式:
void ikun()
{const int is_ikun = 1;
const int& good = is_ikun;
}
三、使用場景
1、做參數(shù)在定義或聲明函數(shù)時,我們可以將函數(shù)的形參指定為引用的形式,這樣在調(diào)用函數(shù)時就會將實參和形參綁定在一起,讓它們都指代同一份數(shù)據(jù)。如此一來,如果在函數(shù)體中修改了形參的數(shù)據(jù),那么實參的數(shù)據(jù)也會被修改,從而擁有“在函數(shù)內(nèi)部影響函數(shù)外部數(shù)據(jù)”的效果。
其實很好理解,我們給坤坤起的外號叫雞哥,現(xiàn)在我說,讓雞哥去打籃球。去的人自然就是坤坤,看似是讓雞哥去做,其實結(jié)果就是坤坤,對雞哥的改變就是對坤坤的改變。
像下面這一,利用引用也可以完成“在函數(shù)內(nèi)部影響函數(shù)外部數(shù)據(jù)”的效果。
void Swap(int& left, int& right)
{int temp = left;
left = right;
right = temp;
}
2、做返回值如下,一個做返回值的小例子:
int &ADD (int r)
{r += 10;
return r;
}
值得注意的是,引用做返回值看似很簡單,但是里面有個小坑??!
那就是在將引用作為函數(shù)返回值時應(yīng)該注意一個小問題,就是不能返回局部數(shù)據(jù)(例如局部變量、局部對象、局部數(shù)組等)的引用,因為當函數(shù)調(diào)用完成后局部數(shù)據(jù)就會被銷毀,有可能在下次使用時數(shù)據(jù)就不存在了。所以,如果函數(shù)返回時,出了函數(shù)作用域,如果返回對象還在(還沒還給系統(tǒng)),則可以使用
引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。
此時,一位悲催的程序員再次以身試法,幫助ikun
避坑:
int& Add(int a, int b)
{int c = a + b;
return c;
}
int main()
{int& ret = Add(1, 2);
Add(3, 4);
cout<< "Add(1, 2) is :"<< ret<< endl;
return 0;
}
四、引用和指針的區(qū)別在語法概念上引用就是一個別名,沒有獨立空間,和其引用實體共用同一塊空間。
但是在底層實現(xiàn)上實際是有空間的,因為引用是按照指針方式來實現(xiàn)的。
分析下面的代碼:
//引用
int main()
{int a = 10;
int& ra = a;
cout<<"&a = "<<&a<
//指針
int main()
{int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 20;
return 0;
}
我們來看下引用和指針的匯編代碼對比:
引用和指針的不同點:
📢📢📢📢📢📢
💗 你正在閱讀 【子夜的星】 的 C++筆記
👍 閱讀完畢,可以點點小手贊一下
🌻 發(fā)現(xiàn)錯誤,直接評論區(qū)中幫我指正吧
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧