- 后臺開發:核心技術與應用實踐
- 徐曉鑫
- 1141字
- 2019-01-03 20:55:32
1.5 引用
1.引用是什么
對于習慣使用C語言進行開發的朋友們,在看到C++中出現的&符號后,可能會犯迷糊,雖然在C語言中這個符號代表取地址符,但是在C++中它卻有著不一樣的用途,代表著引用的意思。掌握C++的&符號,有利于增強代碼質量和提高代碼執行效率。
引用是一種變量類型,它用于為一個變量起一個別名。
引用的聲明方法是:
類型標識符 &引用名=目標變量名;
假設有一個變量a,想給它起一個別名r,可以這樣寫:
int a; int &r=a;
定義引用r,它是變量a的引用,即別名。經過這樣的聲明后,a和r的作用都一樣,都代表著同一變量。a和r占用內存的同一個存儲單元,即具有同一地址。在聲明一個引用變量時,必須同時使之初始化,即聲明它代表哪個變量。函數執行期間,不可以將其再作為其他變量的引用。例1.9說明了引用的使用方法。
【例1.9】 引用的使用舉例。
#include<iostream> using namespace std; int main(){ int a=2; int &r=a; a=a+4; cout<<a<<" "<<r<<endl; // 因為a和r的值會同時變化,所以a和r的值都是6。 r=10; cout<<a<<" "<<r<<endl; // r變了,a也會變,所以a和r的值都是10。 return 0; }
程序的執行結果是:
6 6 10 10
例1.9中展示了引用與變量的關系。r是a的引用,a變了,r的值也跟著變;r變了,a的值也跟著變。
2.引用作為參數
引用一個重要的作用就是作為函數的參數。
【例1.10】 引用作為函數的參數舉例。
#include<iostream> using namespace std; void Mmin1(int a,int b){ int temp; if(a>b){ temp=a; a=b; b=temp; } } void Mmin2(int &a,int &b){ // 引用作為函數的參數 int temp; if(a>b){ temp=a; a=b; b=temp; } } int main(){ int a=30,b=20; Mmin1(a,b); // cout<<a<<" "<<b<<endl; // a、b的值保持不變。 Mmin2(a,b); cout<<a<<" "<<b<<endl; // a的值是20,b的值是30. a、b的值被修改了 return 0; }
程序的執行結果是:
30 20 20 30
例1.10中定義了兩個求最小值的函數,其中Mmin1是將一般變量作為函數的參數,Mmin2則是將引用作為函數的參數。
將一般變量作為函數的參數,傳給形參的是變量的值,傳遞是單向的。如果在執行函數期間形參的值發生變化,并不傳回給實參。因為在調用函數時,形參和實參不是同一個存儲單元。
使用引用傳遞函數的參數時,在內存中并沒有產生實參的副本,而是對實參直接操作。當使用一般變量傳遞函數的參數時,當函數發生調用,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率更高,所占空間更少。
使用指針作為函數的參數雖然也能達到與使用引用同樣的效果,但是在被調函數中同樣要給形參分配存儲單元,且需要重復使用“*指針變量名”的形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參,這些都不太方便。
綜上所述,引用是個有效率的選擇。
3.常引用
如果既要提高程序的效率,又要使傳遞給函數的數據不在函數中被改變,就應該使用常引用。常引用的聲明方式是:
const 類型標識符 &引用名=目標變量名;
用這種方式聲明的引用,不能通過引用對目標變量的值進行修改,在程序中使引用的目標成為const類型,從而保證了引用的安全性,如下所示:
int a; const int &r=a; r=1; // 錯誤 a=1; // 正確
假設有如下函數聲明:
string func1(); void func2(string &s);
那么下面的表達式都是非法的:
func2(func1); func2("hello");
原因在于func1()和"hello"都將產生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此,上面的表達式就是試圖將一個const類型的對象轉化為非const類型,這是非法的。
引用型參數應該在能被定義成const的情況下,盡量定義為const。
- 多媒體CAI課件設計與制作導論(第二版)
- Android項目開發入門教程
- PyTorch Artificial Intelligence Fundamentals
- AngularJS深度剖析與最佳實踐
- RTC程序設計:實時音視頻權威指南
- 學Python也可以這么有趣
- Corona SDK Mobile Game Development:Beginner's Guide(Second Edition)
- Learning Probabilistic Graphical Models in R
- Visual Basic程序設計上機實驗教程
- HTML5權威指南
- Windows Phone 8 Game Development
- 跟戴銘學iOS編程:理順核心知識點
- 基于GPU加速的計算機視覺編程:使用OpenCV和CUDA實時處理復雜圖像數據
- 百萬在線:大型游戲服務端開發
- 軟件設計模式(Java版)