C++ 引用

C++ 引用

定義:

  • 已定義的變量的別名。

使用方法:

  • 聲明引用時必須將其初始化:
    1 int rats=101; 
    2 int & rodents=rats; 


    注意:引用一旦被建立不能更改其與某個變量之間的關係,即引用不能再表明其餘變量。程序員

  • 用做函數參數

用做函數參數時的注意事項:

  • 當實參與引用參數不匹配時:

    • 若參數爲 const 引用且函數調用的參數不是左值或與相應的 const 引用參數的類型不匹配,則 C++ 將建立類型正確的匿名變量,將函數調用的參數的值(實參值)傳遞給該匿名變量(實參值能夠被強制轉換爲相應類型時),並讓參數來引用該變量。這些匿名變量只在函數調用期間存在,此後編譯器即可以隨意將其刪除。所以對於實參爲 const 引用的 C++ 函數,若是實參不匹配且能夠發生強制類型轉換,則其行爲相似於按值傳遞。(例外的是有時非 const 右值引用參數也可達到相似生成匿名變量的效果:如 double && 形參能夠輸入無關左右值的 int 和 const int 類型實參)

注(什麼是左值?):左值參數是可被引用的數據對象,例如變量、數組元素、結構成員、引用和解除引用的指針都是左值。非左值包括字面常量(用引號括起的字符串除外,他們由其地址表示)和包含多項的表達式。編程

  • 儘量使用 const:

    • 使用 const 能夠避免無心中修改數據的編程錯誤。
    • 使用 const 能使函數能處理 const 和非 const 實參,不然將只能接受非 const 數據。
    • 使用 const 引用使函數可以正確生成並使用臨時變量。數組

函數返回引用時須要注意的事項:

  • 避免返回函數終止時不在存在的內存單元引用,解決辦法:函數

    • 返回一個做爲參數傳遞給函數的引用。
    • 用 new 來分配新的存儲空間。
  • 必要時將返回類型聲明爲 const 引用,可避免犯糊塗;經過省略 const ,能夠編寫更簡短代碼,但其含義也更模糊,增長了犯錯的機會,然而有時省略 const 確實有道理。
    1 free_throws & clone(free_throws & ft)
    2 {
    3     ...
    4     return ft;
    5 }
    6 
    7 clone(ft)=four; //it's allowed, four covered ft
    const free_throws & clone(free_throws & ft)
    {
        ...
        return ft;
    }
    
    clone(ft)=four; //it's not allowed
    display(clone(ft)); //it's allowed, you can ues it like this

     

將引用用於對象:

  • 基類引用能夠指向派生類對象,而無需進行強制類型轉換。
    void file_it(ostream & os)
    {
        ...
    }
    ofstream fout;
    file_it(fout);

    例如:參數 os (其類型爲 ostream & )能夠指向 ostream 對象(如 cout ),也能夠指向 ofstream 對象(如 fout )。this

什麼時候使用引用參數:

  • 程序員可以修改調用函數中的數據對象。
  • 經過傳遞引用而不是整個數據對象,能夠提升程序的運行速度。
  • 何時使用引用、何時使用指針,通常性指導原則是
    • 對於使用傳遞的值而不做修改的函數:
      • 若是數據對象很小,如內置數據類型或小型結構,則按值傳遞。
      • 若是數據對象是數組,則使用指針,由於這是惟一的選擇,並將指針聲明爲指向 const 的指針。
      • 若是數據對象是較大的結構,則使用 const 指針或 const 引用,以提升程序的效率。這樣能夠節省複製結構所需的時間和空間。
      • 若是數據對象是類對象,則使用 const 引用。類設計的語義經常要求使用引用,這是 C++ 新增這項特性的主要緣由。所以,傳遞類對象參數的標準方式是按引用傳遞。
    • 對於修改調用函數中數據的函數:
      • 若是數據對象是內置數據類型,則使用指針。若是看到諸如 fixit(&x) 這樣的代碼(其中 x 是 int ),則很明顯,該函數將修改 x 。
      • 若是數據對象是數組,則只能使用指針。
      • 若是數據對象是結構,則使用引用或指針。
      • 若是數據對象是類對象,則使用引用。

 

 

右值引用:

  • C++ 11 新增了右值引用——這種引用可指向右值,使用 && 聲明,以前的引用稱爲左值引用。
相關文章
相關標籤/搜索