返回引用是左值

來源:互聯網
上載者:User

函數傳回值分為:值,引用,指標三種。引用是c沒有而c++有的,並且因為引用是左值實現了運算子連續運算的基礎,而值和引用都不可以。下面我們就來看一下這三種返回方式的各自的特點:

1、傳回值

int test1(){    int a = 1;    retur a;}

傳回值是最簡單有效方式,他的操作主要在棧上,根據函數棧的特性局部變數a會在函數結束時被刪除,為了返回a的值,需要產生a的複製。如果a原子類型這當然也無所謂,但是如果a是大的對像,那麼對a的複製將會產生比較嚴重的資源和效能消耗。注意函數傳回值本身因為沒有名稱或引用是右值,是不能直接操作的。

2、返回指標

int* test2(){    int *b = new int();    *b = 2;    return b;}

返回指標是在C中除了傳回值以外的唯一方式,根據函數棧的特性也會產生複製,但是這個複製只是4(8)位元組的指標,對於返回大型對像來說確實能夠減少不少的資源消耗。但是返回指標資源的清理工作交給了調用者,這某種意義上違反了誰申請誰銷毀的原則。指標也是右值同樣無法操作。

3、返回引用

int& test2(){    int *b = new int();    *b = 2;    return *b;}

引用是C++中新添加的概念,所以返回引用也是C++中相對於C來說所沒有的。引用是值的別名,和指標一樣不存在對大對像本身的複製,只是引用別名的複製。引用是左值,返回引用可以直接操作,也就可以進行連續賦值,最經典的樣本是拷貝建構函式和運算子多載一般返回引用。

test2()+=1;

但是,返回引用會帶來一個問題,那就是返回局部變數記憶體空間,會產生異常,也就是說局部變數是不能作為引用返回的。局部指標可以作為引用返回但是和返回指標一樣需要調用者自己去清理記憶體。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.