c++的引用用法


一、引用簡介

引用就是某一變量(目標)的一個別名,對引用的操作與對變量的直接操作完全一樣。
引用的聲明方法:類別標識符&引用名=目標變量名;
例1:

int a;
int &ra=a; //定義引用ra,它是變量a的引用,即別名。

說明:

  • &在此處不是取地址運算,而是標識作用。
  • 類型標識符是指目標變量的類型。
  • 聲明引用時,必須對其進行初始化。
  • 引用聲明完畢后,相當於目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量的別名,ra=1相當於a=1
  • 聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,他本身不是一種數據類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。因此對引用求地址,就是對目標變量求地址。
  • 不能建立數組的引用,因為數組是一個由若干個元素組成的集合,所以無法建立一個數組的別名。

二、引用應用

  1. 引用作為參數
void swap(int &p1,int &p2) //函數形參都是引用
int p;
p=p1;
p1=p2;
p2=p;

為在程序中調用該函數,則在相應的主調函數的調用點處,直接以變量作為實參調用即可,而不需要實參變量有任何的特殊要求。

int main()
{
int a,b;
cin>>a>>b;
swap(a,b);
return 0;
}

說明:

  • 傳遞引用給函數與傳遞指針的效果一樣,這時,被調函數的形參就成為原來主調函數中的實參變量或對象的一個別名。
  • 使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作。而使用一般變量傳遞函數的參數時,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數效率和所占空間都好。
  • 使用指針作為函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配存儲單元,且需要重復使用"*指針變量名"的 形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參。而引用更容易使用,更清晰。
  1. 常引用
    如果既要利用引用提高程序效率,又要保護傳遞給函數的數據不在函數中被改變,使用常引用。
    聲明方式:const 類型標識符 &引用名=目標變量名
    例3:
int a ;
const int &ra=a;
ra=1; //錯誤
a=1; //正確
  1. 引用作為返回值
    用引用返回函數值,在內存中不產生被返回的副本。
    聲明方式:
    類型標識符 &函數名(形參列表及類型說明)
    {函數體}
    例4:
float temp;  //定義全局變量temp
float fn1(float r);  //聲明函數fn1
float &fn2(float r);  //聲明函數fn2,以引用的方式返回。

float fn1(float r)  //定義函數fn1,它以返回值的方法返回函數值
{
 temp=(float)(r*r*3.14);
 return temp;
}

float &fn2(float r) //定義函數fn2,它以引用方式返回函數值
{
 temp=(float)(r*r*3.14);
 return temp;
}

void main() //主函數
{
 float a=fn1(10.0); //第1種情況,系統生成要返回值的副本(即臨時變量)
 float &b=fn1(10.0); //第2種情況,可能會出錯(不同 C++系統有不同規定)
 //不能從被調函數中返回一個臨時變量或局部變量的引用

 float c=fn2(10.0); //第3種情況,系統不生成返回值的副本
 //可以從被調函數中返回一個全局變量的引用
 float &d=fn2(10.0); //第4種情況,系統不生成返回值的副本
 //可以從被調函數中返回一個全局變量的引用
 cout<<a<<c<<d;
}

說明:

  • 不能返回局部變量的引用。主要原因是局部變量會在函數返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會進入未知狀態。
  • 不能返回函數內部new分配的內存的引用。
  • 可以返回類成員的引用,但最好是const。
  • 引用與一些操作符的重載:

三、總結

  1. 在引用的使用中,單純給某個變量取個別名是毫無意義的,引用的目的主要用於在函數參數傳遞中,解決大塊數據或對象的傳遞效率和空間不如意的問題。
  2. 用引用傳遞函數的參數,能保證參數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。
  3. 引用與指針的區別是,指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。
  4. 使用引用的時機。流操作符<<和>>、賦值操作符=的返回值、拷貝構造函數的參數、賦值操作符=的參數、其它情況都推薦使用引用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM