1. 程式人生 > >C++基礎知識(八)---函式返回值(返回值,返回指標,返回物件,返回引用)---引用---複製建構函式(拷貝建構函式)

C++基礎知識(八)---函式返回值(返回值,返回指標,返回物件,返回引用)---引用---複製建構函式(拷貝建構函式)

一、函式返回值

  1.返回值:

int test ()
{
int a=1;
return a;
}

 

  • 返回值時最簡單的方式,它的操作主要在棧上,變數a在函式結束後會刪除,為了返回a的值,系統會在內部建立一個臨時變數儲存a的值,以返回給呼叫該函式的表示式,呼叫結束後變數便不再存在。如果a是簡單地資料型別也無所謂,不是很佔用記憶體,如果a是大的自定義型別的資料,那麼對a的複製將會佔用比較大的記憶體。函式返回值是右值,不能進行運算子操作。

  2.返回指標:

  • int *test2()
    {
    int *b=new int();
    *b=2
    ; return b; }
    • 返回指標是在C中除了返回值以外的唯一方式,根據函式棧的特性,也會產生複製,只是複製的是一個指標即一個地址,對於返回大型物件可以減少不少的資源消耗。但返回指標的資源的清理交給了呼叫者,這違反了誰申請誰銷燬的原則。指標也是右值同樣無法操作。

  3.返回引用:

  • int& test2()
    {
    int *b=new();
    *b=2;
    return b;
    }
    • 引用是值的別名,和指標一樣不存在對大物件本身的複製,只是引用別名的複製。引用是左值,可以直接進行操作,也可以進行連續賦值,最經典的例項是拷貝建構函式與運算子過載一般都返回引用。
    • 需要注意的是區域性變數不能作為引用返回。

  • C++中成員函式返回物件與返回引用
    • 返回物件與返回引用的區別:函式原型與函式頭
      • Car run(const Car&)//返回物件
      • Car& run(const Car&)//返回引用
    • 返回物件涉及到生成物件的副本。因此返回物件的成本包括了呼叫複製建構函式來生成副本所需要的時間和呼叫解構函式刪除副本所需要的時間。返回引用可以節省時間和記憶體。直接返回物件與函式直接return a返回值一樣。都會生成臨時副本。



 

二、C++中的引用

  1.吃飯回來繼續補充