要以引用返回函數值,則函數定義時的格式如下:
類型標識符&類型名 (形參列表及類型說明)
{ 函數體 }
用const限定引用的聲明方式為:
const 類型標識符&引用名=目標變量名;
用這種方式聲明的引用不能通過引用對目標變量的值進行修改,從而使引用的目標成為const,保證了 引用的安全性。
注意幾點:
- 要以引用返回函數值,則定義函數時需要在函數名前加上&。
- 用引用返回一個函數值的最大好處是:在內存中不產生被返回值的副本;而用普通的返回值的方法返回一個函數的函數值時,需要在內存中先創建一個臨時變量,在被調函數返回時,將函數值復制到該臨時變量中,主調函數再以該臨時變量的值進行運算。
- 在引用的使用中,單純給某個變量取個別名是毫無意義的, 引用的目的主要是在函數參數傳遞中解決大對象的傳遞效率和空間不如意的問題。
- 用引用傳遞函數的參數能保證參數傳遞中不產生副本和提高傳遞的效率,且通過const的使用,又保證了引用傳遞的安全性。
- 引用與指針的區別在於:指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作,程序中使用指針使程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。
- 一般情況下,賦值表達式的左邊只能是變量名,即被賦值的對象必須是變量,因為孩子有變量才能被賦值,而常量或表達式不能被賦值,但如果一個函數的返回值是引用,則賦值號的左邊可以是該函數的調用。
本人自學,教材可能有點老,有問題的話求大家指正!!!謝謝!!!
例題:
- 定義一個普通的函數,使用返回值的方法返回函數值,定義另一個函數使用引用的方法返回函數值
1 #include<iostream> 2 using namespace std; 3 4 5 int f1(int a); 6 int &f2(int a); 7 8 int f1(int a) 9 { 10 int num; 11 num = a*10; 12 return num; 13 } 14 15 int &f2(int a) 16 { 17 int num; 18 num = a*20; 19 return num; 20 } 21 22 int main() 23 { 24 int a,b; 25 a=f1(1); 26 b=f2(2); 27 cout << f1(4) << endl; 28 cout << f2(5) << endl; 29 cout << a << endl; 30 cout << b << endl; 31 //int &ra=f1(3); 這種用法可能會出錯,(不同C++系統有不同規定) 32 int &rb=f2(3); 33 cout << rb << endl; 34 return 0; 35 }
- 使用返回引用的函數值作為賦值表達式的左值
1 #include<iostream> 2 using namespace std; 3 4 int &put(int n); 5 int vals[10]; 6 int error=-1; 7 8 9 int &put(int n) 10 { 11 if(n>=0 && n<=9) 12 return vals[n]; 13 else 14 { 15 cout << "error!" << endl; 16 return error; 17 } 18 } 19 20 int main() 21 { 22 put(0)=10; 23 put(9)=20; 24 cout << vals[0] << endl; 25 cout << vals[9] << endl; 26 return 0; 27 }
- 使用const限定引用
1 include<iostream> 2 using namespace std; 3 4 int &fn(const int &a) 5 { 6 //a=32; 錯誤!不可以進行賦值 7 int b=a; 8 return b; //如果返回a,也會報錯 9 } 10 11 int main() 12 { 13 int &a = fn(32); 14 cout << a << endl; 15 return 0; 16 } 17 18 //菜鳥,求大家批評指教,代碼編寫習慣和規范等等!!!謝謝!!!
本人自學,教材可能有點老,有問題的話求大家指正!!!謝謝!!!