C++引用的做用和用法

引用就是某一變量(目標)的一個別名,對引用的操做與對變量直接操做徹底同樣。ios

引用的聲明方法:類型標識符&引用名=目標變量名;數組

例如:函數

int q;
int &ra=a;

說明:spa

  • &在此不是求地址運算,而是標識做用。
  • 類型表示符是指目標變量的類型。
  • 聲明引用時,必須同時對其進行初始化。
  • 引用聲明完,至關於目標變量名有兩個別名,即該目標原名稱和應用名,切不能把該引用名做爲其餘變量名的別名。
  • 聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它自己不是一種數據類型,所以引用自己不佔存儲單元,系統也不給引用分配存儲單元。故:對指針

    引用求地址,就是對目標變量求地址。&ra與&a相等。code

  •  不能創建數組的引用。由於數組是一個由若干個元素所組成的集合,因此沒法創建一個數組的別名。對象

引用應用blog

  1. 引用做爲參數

引用的一個重要做用就是做爲函數的參數。之前的C語言中函數參數傳遞是值傳遞,若是有大塊數據做爲參數傳遞的時候,採用的方案每每是指針,由於這樣能夠避免將整塊數據所有壓棧,內存

能夠提升程序的效率。可是如今(C++中)又增長了一種一樣有效率的選擇(在某些特殊狀況下又是必須的選擇),就是引用。ci

void swap(int &p1,int &p2)
//此處函數的形參p1, p2都是引用  
{
int p;
p=p1;
p1=p2;
p2=p;
}

爲在程序中調用該函數,則相應的主調函數的調用點處,直接以變量做爲實參進行調用便可,而不須要實參變量有任何的特殊要求。

如:對應上面定義的swap函數,相應的主調函數可寫爲:

main()
{
  int a,b;
  cin>>a>>b;
  swap(a,b);
//直接以a,b做爲實參調用swap函數
  cout<<a<<' '<<b;        
}
  1. 傳遞引用給函數和傳遞指針給函數的效果是同樣的。這時,被調函數的形參就成爲原來主調函數中的實參變量或對象的一個別名來使用,因此在被調函數中,對形參變量的操做就是對其相應的目標對象的操做。
  2. 使用引用傳遞函數的參數,在內存中並無產生實參的副本,它是直接對實參操做;而使用通常變量傳遞函數的參數,當發生函數調用時,須要給形參分配存儲單元,形參變量是實參

    變量的副本;若是傳遞的是對象,還將調用拷貝構造函數。所以,當參數傳遞的數據較大時,用引用比用通常變量傳遞參數的效率和所佔空間都好。 

  3. 使用指針做爲函數的參數雖然也能達到與使用引用的效果,可是,在被調函數中一樣要給形參分配存儲單元,且須要重複使用"*指針變量名"的形式進行運算,這很容易產生錯誤且程序

    的閱讀性較差;另外一方面,在主調函數的調用點處,必須用變量的地址做爲實參。而引用更容易使用,更清晰。

二、引用做爲返回值

 要以引用返回函數值,則函數定義時要按如下格式:

 類型標識符&函數名(形參列表及類型說明)

{函數體} 

 說明:

1以引用返回函數值,定義函數時須要在函數名前加

2用引用返回一個函數值的最大好處是,在內存中不產生被返回值的副本。

 例

#include <iostream.h>
float 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)//系統生成要返回值的副本(即臨時變量)
    float &b=fn1(10.0)//可能會出錯,
//不能從被調函數中返回一個臨時變量或局部變量的引用
    float c=fn2(10.0); //第3種狀況,系統不生成返回值的副本   
 //能夠從被調函數中返回一個全局變量的引用 
   float &d=fn2(10.0); //第4種狀況,系統不生成返回值的副本 
   //能夠從被調函數中返回一個全局變量的引用 
   cout<<a<<c<<d;
}
相關文章
相關標籤/搜索