C++中酷窥,&符號(hào)作為別名的意義

在C++的開發(fā)中咽安,我們知道,要給一個(gè)變量取別名的語(yǔ)法是Type& name = var蓬推,此時(shí)需要修改變量指向的空間妆棒,除了用變量直接修改,還可以通過指針沸伏,另外一個(gè)就是使用別名修改(C++中引用)糕珊。

下面設(shè)定了ABCDEF測(cè)試函數(shù):

  • int getA() 作為是最常見的函數(shù)形式,直接將數(shù)值返回 int毅糟。
  • int& getB() 的返回值int&红选,此時(shí)可以用一個(gè)變量取把地址別名在主調(diào)函數(shù)中接收過來(lái)。
  • int& getC() 的返回值是int&(與B相同),此時(shí)我們返回的是內(nèi)存塊的別名留特,別名作為左值可以對(duì)其內(nèi)容進(jìn)行操作纠脾。但是沒有辦法作為右值賦值玛瘸,不能返回局部變量的引用。主要原因是局部變量會(huì)在函數(shù)返回后被銷毀苟蹈,因此被返回的引用就成為了"無(wú)所指"的引用糊渊,程序會(huì)進(jìn)入未知狀態(tài)。
  • int getD()int& getE()和上面的解釋一致慧脱,只不過是在函數(shù)體內(nèi)聲明了一個(gè)static的標(biāo)識(shí)符渺绒,代表該變量是靜態(tài)的不需要重復(fù)賦值,有自己的內(nèi)存區(qū)域菱鸥,函數(shù)消失后不會(huì)自動(dòng)銷毀宗兼。
#include "iostream"

using namespace std;

int getA(){
    int a;
    a = 10;
    return a;
}


int& getB(){
    int a;
    a = 10;
    return a;
}

int& getC(){
    int a;
    a = 10;
    return a;
}

int getD(){
    static int a = 10;
    a ++ ;
    printf("a: %d \n",a);
    return a;
}

int& getE(){
    static int a = 10;
    a ++ ;
    printf("a: %d \n",a);
    return a;
}

int* getF(){
    static int a = 10;
    a ++ ;
    printf("getF::a: %d \n",a);
    return &a;
}

int main(){

    int a = 10;//此處a的意思實(shí)際上是內(nèi)存空間的別名,分配了4個(gè)字節(jié)的內(nèi)存
    int &b = a;//在這里起一個(gè)別名氮采, 語(yǔ)法為: Type& name = var;
    b = 20;//間接修改了a
    printf("a:%d \n",a);

    {
        int *p = &a;
        *p = 12;
        printf("a:%d \n",a);
    }

    int a1 = 0;
    int a2 = 0;
    a1 = getA();
    a2 = getB();
    int &a3 = getC();

    //& 表示取該變量的別名
    int &a4 = a1;
    a4 = 30;

    //  此處相當(dāng)于返回一個(gè) 11 這個(gè)時(shí)候是沒有辦法進(jìn)行賦值的: 11 = 100殷绍;僅僅是一個(gè)數(shù)值,沒有內(nèi)存地址
    //getD() = 100;

    //此處是相當(dāng)于返回了一個(gè) 開辟了內(nèi)存空間的變量地址鹊漠,是允許需改內(nèi)容的: a = 100;
    //但被調(diào)用的函數(shù)當(dāng)作左值的時(shí)候主到,必須返回一個(gè)引用
    getE() = 100;


    //該代碼在C的編譯器下是無(wú)法通過的 需要改寫成   *(a1 > a2 ? &a1 : &a2) = 100;才能在C的編譯器下通過
    //但是該代碼在C++編譯器下是沒有問題的,已經(jīng)做了內(nèi)部?jī)?yōu)化
    (a1 > a2 ? a1 : a2) = 100;

    printf("a1: %d \n",a1);
    printf("a2: %d \n",a2);
    printf("a3: %d \n",a3);

    //此處是手工打造改變內(nèi)存空間的條件
    *(getF()) = 100;
    getF();

    system("pause");

    return 0;
}

C++ 引用的作用和用法

網(wǎng)上摘抄了一段覺得非常好的總結(jié)躯概,如下:

引用的好處之一就是在函數(shù)調(diào)用時(shí)在內(nèi)存中不會(huì)生成副本登钥。

引用總結(jié)

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

  2. 用引用傳遞函數(shù)的參數(shù)姿锭,能保證參數(shù)傳遞中不產(chǎn)生副本塔鳍,提高傳遞的效率,且通過const的使用呻此,保證了引用傳遞的安全性献幔。

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挽拔,隨后出現(xiàn)的幾起案子辆脸,更是在濱河造成了極大的恐慌,老刑警劉巖螃诅,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啡氢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡术裸,警方通過查閱死者的電腦和手機(jī)倘是,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袭艺,“玉大人搀崭,你說(shuō)我怎么就攤上這事』啵” “怎么了门坷?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)袍镀。 經(jīng)常有香客問我,道長(zhǎng)冻晤,這世上最難降的妖魔是什么苇羡? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鼻弧,結(jié)果婚禮上设江,老公的妹妹穿的比我還像新娘。我一直安慰自己攘轩,他們只是感情好叉存,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著度帮,像睡著了一般歼捏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笨篷,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天姻成,我揣著相機(jī)與錄音肄程,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛垮庐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼燕锥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起悯蝉,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤归形,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泉粉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體连霉,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嗡靡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跺撼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讨彼,死狀恐怖歉井,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哈误,我是刑警寧澤哩至,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蜜自,受9級(jí)特大地震影響菩貌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜重荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一箭阶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戈鲁,春花似錦仇参、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至婆芦,卻和暖如春怕磨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背消约。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工癌压, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荆陆。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓滩届,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帜消,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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