C++:引用語法

本文是筆者在C++學(xué)習(xí)過程中挫剑,對引用語法的總結(jié)記錄,如有不隊的地方柱衔,歡迎大家指正樊破!


一、 什么是引用

??引用(reference)唆铐,是C++對C語言的一項擴充哲戚,作用是給變量起別名,換句話說艾岂,就是將多個變量名指向同一個地址顺少,從而使對其中的任意一個變量名的操作,都是對同一地址的操作。而在這種情況下脆炎,被聲明為引用類型的變量名梅猿,就是實際變量名的一個別名。


二秒裕、引用的基本語法與注意事項

1袱蚓、 聲明語法

??引用的聲明語法:數(shù)據(jù)類型 &引用變量名 = 原變量名;

eg:

#include <iostream>
using namespace std;

int main() {
    //語法:數(shù)據(jù)類型 &引用變量名 = 原變量名几蜻;
    int a=10;
    int &reference_a=a;

    cout<<"a="<<a<<endl;                     //a=10
    cout<<"reference_a="<<reference_a<<endl; //reference_a=10

    a+=10;
    cout<<"a="<<a<<endl;                     //a=20
    cout<<"reference_a="<<reference_a<<endl; //reference_a=20

    reference_a+=10;
    cout<<"a="<<a<<endl;                     //a=30
    cout<<"reference_a="<<reference_a<<endl; //reference_a=20
       
    return 0;
}

2喇潘、 注意事項

  1. 對引用進行操作,實際上就是對被引用的變量進行操作梭稚。

  2. 聲明引用時颖低,必須對其進行初始化。

  3. 引用在初始化之后弧烤,不可以再進行修改忱屑。

  4. 引用變量在編譯器的底層實現(xiàn)是指針常量,即一個指針指向不可以發(fā)生更改的指針扼褪,所以引用占用內(nèi)存空間的大小想幻,和指針其實是一樣的。

    但是话浇,和指針不同的是脏毯,引用實際上不能算是一個變量,所以對引用變量求地址幔崖,與對實際變量求地址食店,結(jié)果是相同的。

#include <iostream>
using namespace std;

int main() {
    int a=10;
    int &reference_a=a;

    //對引用變量求地址,與對實際變量求地址赏寇,結(jié)果是相同的
    cout<<"對引用變量求地址"<<endl;
    cout<<"a的地址:"<<&a<<endl;
    cout<<"reference_a的地址:"<<&reference_a<<endl;
    
    return 0;
}

運行結(jié)果:


對引用變量求地址 運行結(jié)果
  1. 不能建立引用的數(shù)組吉嫩,即數(shù)組中的元素不能是引用。因為引用使勁上并不能算是一個變量嗅定,所以在聲明引用的數(shù)組時自娩,并不能分配內(nèi)存,也就無法聲明和定義引用數(shù)組渠退。

    但是忙迁,可以建立數(shù)組的引用,這是沒有問題的碎乃。

#include <iostream>
using namespace std;

int main() {
    //不能建立引用的數(shù)組姊扔,但是,可以建立數(shù)組的引用
    int arr[]={0,1,2,3,4};
    // int &re_arr=&arr; 
    // 編譯錯誤
    // error: invalid conversion from ‘int (*)[5]’ to ‘int’

    //數(shù)組的引用
    int (&re_arr)[5]=arr;

    return 0;
}

三梅誓、引用作為函數(shù)參數(shù)

??引用在C++中的一個重要作用恰梢,就是可以作為函數(shù)的參數(shù)使用佛南。

??在C語言之中,函數(shù)參數(shù)傳遞使用的方法是值傳遞嵌言,而在有大量數(shù)據(jù)作為參數(shù)傳遞時嗅回,往往采用的是地址傳遞,即使用指針呀页,來避免在函數(shù)調(diào)用時有大量數(shù)據(jù)壓入棧中÷璋瑁現(xiàn)在,C++中可以使用引用作為函數(shù)參數(shù)蓬蝶,以此來代替指針作為函數(shù)參數(shù)尘分,這種方法可以使代碼更易閱讀和維護。

eg:

#include <iostream>
using namespace std;

//引用作為函數(shù)參數(shù)
void fun1(int &a,int &b);

int main() {
    int a=10;
    int b=20;
    cout<<"a="<<a<<",b="<<b<<endl;
    fun1(a,b);
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
}

//引用作為函數(shù)參數(shù)
void fun1(int &a,int &b){
    int temp=a;
    a=b;
    b=temp;
}

運行結(jié)果:


引用作為函數(shù)參數(shù) 運行結(jié)果

??可以看出丸氛,在使用引用作為函數(shù)參數(shù)時培愁,與使用指針作為函數(shù)參數(shù)的效果一致,也就是在調(diào)用方法的時候缓窜,可以用形參修飾實參定续。


四、引用作為函數(shù)返回值

??C++支持將引用作為函數(shù)的返回值返回禾锤。

eg:

#include <iostream>
using namespace std;

//引用作為函數(shù)返回值
int& fun2(int &a);

int main() {
    int b=10;
    cout<<"fun2()前,b="<<b<<endl;
    cout<<"fun2()后,b="<<fun2(b)<<endl;
    return 0;
}

int& fun2(int &a){
    a*=a;
    return a;
}

運行結(jié)果:


引用作為函數(shù)返回值 運行結(jié)果

注意事項

1. 不要返回局部變量的引用

??因為局部變量是存放在棧區(qū)的私股,在函數(shù)返回后,局部變量就會被銷毀恩掷,所以返回的引用就會像懸空指針一樣倡鲸,指向一個未知的空間。

eg:

#include <iostream>
using namespace std;

int& func2_local();

int main() {
    int &ref_locol=func2_local();
    
//    cout<<"ref_locol="<<ref_locol<<endl;          //編譯錯誤
    cout<<"ref_locol的地址為:"<<&ref_locol<<endl;   //輸出地址為0
    
    return 0;
}

// 不要返回局部變量的引用
int& func2_local(){
    int a=10;   //棧區(qū)黄娘,函數(shù)調(diào)用結(jié)束后釋放
    return a;   //Reference to stack memory associated 
                // with local variable 'a' returned
}

運行結(jié)果:


不要返回局部變量的引用 運行結(jié)果

2. 函數(shù)調(diào)用可以作為左值

eg:

#include <iostream>
using namespace std;

int& func2_left();

int main() {
    int left=func2_left();
    cout<<"left="<<left<<endl;
    cout<<"func2_left()作為左值峭状,修改為100"<<endl;
    func2_left()=100;
    cout<<"left="<<left<<endl;
    return 0;
}

//函數(shù)調(diào)用可以作為左值
int& func2_left(){
    static int a=10; //全局區(qū),程序結(jié)束后由系統(tǒng)釋放
    return a;
}

運行結(jié)果:


函數(shù)調(diào)用可以作為左值 運行結(jié)果

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

??這種編程習(xí)慣是非常不好的逼争,因為每個用 new 產(chǎn)生的指針都要調(diào)用 delete 釋放优床,否則就會造成內(nèi)存泄漏。而在被函數(shù)返回的引用作為一個臨時變量時誓焦,我們很容易未對其進行釋放胆敞,從而造成內(nèi)存泄漏。

eg:

#include <iostream>
#include <string>
using namespace std;

string& func2_new();

int main() {
    string &str=func2_new();    //如果調(diào)用后沒有用 delete 釋放杂伟,就會造成內(nèi)存泄漏
    cout<<"str="<<str<<endl;
    delete &str;                //釋放
    return 0;
}
//不要返回函數(shù)內(nèi)部使用 new 分配的內(nèi)存的引用
string& func2_new(){
    string* str=new string("hello world");
    return *str;
}

??由代碼可以看出竿秆,返回函數(shù)內(nèi)部使用 new 分配的內(nèi)存的引用時,極易引起內(nèi)存泄漏稿壁,尤其是在形如以下代碼的情況下:

string str="hello world"+func2_new();

五、常量引用/常引用

??聲明方式:const 數(shù)據(jù)類型 &引用名 = 目標(biāo)變量名歉备;

eg:

#include <iostream>
using namespace std;

string& func3();

int main() {
    func3(a);
    return 0;
}

//常量引用/常引用
void func3(const int &a){
    cout<<"a="<<a<<endl;
}

??常引用主要用于修飾形參傅是,防止函數(shù)中誤操作。另外,在引用作為函數(shù)參數(shù)時應(yīng)該盡量定義為 const 喧笔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帽驯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子书闸,更是在濱河造成了極大的恐慌尼变,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浆劲,死亡現(xiàn)場離奇詭異嫌术,居然都是意外死亡,警方通過查閱死者的電腦和手機牌借,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門度气,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膨报,你說我怎么就攤上這事磷籍。” “怎么了现柠?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵院领,是天一觀的道長。 經(jīng)常有香客問我够吩,道長比然,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任废恋,我火速辦了婚禮谈秫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鱼鼓。我一直安慰自己拟烫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布迄本。 她就那樣靜靜地躺著硕淑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘉赎。 梳的紋絲不亂的頭發(fā)上置媳,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音公条,去河邊找鬼拇囊。 笑死,一個胖子當(dāng)著我的面吹牛靶橱,可吹牛的內(nèi)容都是我干的寥袭。 我是一名探鬼主播路捧,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼传黄!你這毒婦竟也來了杰扫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤膘掰,失蹤者是張志新(化名)和其女友劉穎章姓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體识埋,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡凡伊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年赞枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了殿衰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡厌衙,死狀恐怖辜纲,靈堂內(nèi)的尸體忽然破棺而出笨觅,到底是詐尸還是另有隱情,我是刑警寧澤耕腾,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布见剩,位于F島的核電站,受9級特大地震影響扫俺,放射性物質(zhì)發(fā)生泄漏苍苞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一狼纬、第九天 我趴在偏房一處隱蔽的房頂上張望羹呵。 院中可真熱鬧,春花似錦疗琉、人聲如沸冈欢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凑耻。三九已至,卻和暖如春柠贤,著一層夾襖步出監(jiān)牢的瞬間香浩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工臼勉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邻吭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓宴霸,卻偏偏與公主長得像镜盯,于是被迫代替她去往敵國和親岸裙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容