我要理解 C++ 引用

背景

實際項目中涉及到對 C++ 引用的使用,這里記錄個人對其的理解嘴纺,并把它加入到個人「專業(yè)」知識結(jié)構(gòu)

是什么

  • 在 C++ 編程語言中的引用是一種「復合數(shù)據(jù)類型」,是在基本類型的基礎上衍生出來的類型
  • 從 C 語言中的「指針」衍生出來的比指針「安全」但沒有指針強大的一種數(shù)據(jù)類型
  • 在實現(xiàn)上,引用可以作為「已存在」的「對象」的「新名字」哈踱。舉個例子送悔,如圖所示慢显,假設 obj 變量在內(nèi)存中 0x08E4100 地址處,我們定義一個 reference 引用 obj 對象欠啤,則 reference 變量的地址也是 0x08E4100

為什么

從使用的角度來分析荚藻,C++ 語言使用引用是為了解決函數(shù)調(diào)用時參數(shù)拷貝導致的性能問題

怎么用

方法參數(shù)

引用作為方法參數(shù)可以實現(xiàn)傳出「方法結(jié)果」的目的

void square(int x, int& result) 
{
    result = x * x;
}
  • 上面 square 方法調(diào)用后,從 result 變量可以拿到 x 的平方信息
  • 調(diào)用方不用進行不必要的取地址操作洁段,更「節(jié)省時間」

方法返回值

int& preinc(int& x) 
{
    return ++x;  // "return x++;" 這樣寫會出錯应狱?臨時對象?
}

preinc(y) = 5; // 等同于 ++y, y = 5;
  • 方法返回引用可以作為「左值」被賦值
  • 不要返回「局部」對象的引用祠丝,因為調(diào)用結(jié)束后棧上局部對象的「內(nèi)存」會被后續(xù)函數(shù)調(diào)用破壞
  • 因為引用就是「原對象」的「別名」疾呻,故把它當做原對象使用,左值和右值都一樣使用

優(yōu)化方法調(diào)用時參數(shù)拷貝開銷

void f_slow(BigObject x) { /* ... */ }  
void f_fast(const BigObject& x) { /* ... */ }

BigObject y;

f_slow(y); // 很慢写半,因為要拷貝 y 對象到 x 對象
f_fast(y); // 很快岸蜗,因為直接訪問只讀變量 y 的地址
  • 通常函數(shù)調(diào)用時使用 const T & 可以減少「對象拷貝」時間開銷
  • 如果 f_fast 內(nèi)部需要對 y 「對象的副本」進行操作,那么需要自己拷貝一份
  • 雖然傳遞「大對象」可以用指針解決污朽,但是「小對象」就沒必要了散吵,然而引用更靈活,不管大小對象都適用蟆肆,兼容性好

內(nèi)部原理

引用就是對象的別名
  • 編譯器是如何處理引用的矾睦?

優(yōu)缺點

  • 優(yōu)點是減少函數(shù)調(diào)用時參數(shù)拷貝的性能開銷

最佳實踐

  • 不要返回函數(shù)局部對象的引用,棧上數(shù)據(jù)會被后續(xù)函數(shù)修改
  • 函數(shù)參數(shù)盡量使用引用

練習題

  • 對比引用和被引用對象的地址炎功,在使用層面理解引用的本質(zhì)

總結(jié)

  • 最后得出一句話「引用就是變量的別名枚冗,指向同一個內(nèi)存地址」

參考

【1】C++ 引用 https://en.wikipedia.org/wiki/Reference_(C++)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛇损,隨后出現(xiàn)的幾起案子赁温,更是在濱河造成了極大的恐慌,老刑警劉巖淤齐,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件股囊,死亡現(xiàn)場離奇詭異,居然都是意外死亡更啄,警方通過查閱死者的電腦和手機稚疹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祭务,“玉大人内狗,你說我怎么就攤上這事怪嫌。” “怎么了柳沙?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵岩灭,是天一觀的道長。 經(jīng)常有香客問我赂鲤,道長噪径,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任数初,我火速辦了婚禮熄云,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妙真。我一直安慰自己缴允,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布珍德。 她就那樣靜靜地躺著练般,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锈候。 梳的紋絲不亂的頭發(fā)上薄料,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音泵琳,去河邊找鬼摄职。 笑死,一個胖子當著我的面吹牛获列,可吹牛的內(nèi)容都是我干的谷市。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼击孩,長吁一口氣:“原來是場噩夢啊……” “哼迫悠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巩梢,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤创泄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后括蝠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞠抑,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年忌警,在試婚紗的時候發(fā)現(xiàn)自己被綠了搁拙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖感混,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情礼烈,我是刑警寧澤弧满,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站此熬,受9級特大地震影響庭呜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犀忱,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一募谎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阴汇,春花似錦数冬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哥倔,卻和暖如春秸架,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咆蒿。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工东抹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沃测。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓缭黔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒂破。 傳聞我的和親對象是個殘疾皇子试浙,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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