c++數組的引用


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

引用最大的好處就是提高函數效率以及節省空間;

關鍵問題一、傳遞引用與傳指針、傳值的區別?

     值傳遞 (pass by value),指針傳遞(pass by pointer),當發生函數調用時,需要給形參分配存儲單元、當傳遞是對象時,要調用拷貝構造函數。

而且指針最后析構時,要處理內存釋放問題。

      引用傳遞(pass by refenrence),在內存中沒有產生形參。效率大大提高!也不用處理指針的析構問題。

      通過以上分析,我們設計程序時在形參中數據較為復雜時(比如以對象作為參數),應該盡量使用引用,少利用指針與值傳遞。

引用只能是"某一"變量的一個別名;具有一經定義就不可更改性;

int a = 10;

int b = 20;

int &c = a; //給變量a定義一個別名c;且c只能是a變量的別名;(如int &c = b 與 c = b; //錯誤)

數組的引用

int a[10] ={0};

int &b = (&a)[10];

實際應用對比

復制代碼
 1 #include "stdafx.h"  2 #include<iostream>  3 using namespace std;  4 void PrintValues(const int ia[10])  5 {  6 for (int i = 0; i < 10; i++)  7  {  8 cout << ia[i] << endl;  9  } 10 } 11 12 int main() 13 { 14 int j[2] = { 0, 1 }; 15  PrintValues(j); 16 return 0; 17 }
復制代碼

這里因為編譯器忽略了為任何數組形參指定長度,所以會造成數組內存越界問題。

      而且,數組有二個特性,影響作用在數組上的函數:一是不能復制數組,二是使用數組名時, 數組名會自動指向其第一個元素的指針。因為不能復制,所以無法編寫使用數組類型的形參,數組會自動轉化為指針。

      我們驗證下,將Void PrintValues(const int ia[10])改為 Void PrintValues(const int *ia),結果與上圖一致,這里就不貼了。

     那么怎么解決這個問題呢?

復制代碼
#include "stdafx.h" #include<iostream> using namespace std; void PrintValues(const int *ia,int size) { for (int i = 0; i < size; i++) { cout << ia[i] << endl; } } int main() { int j[] = { 0, 1 }; PrintValues(j,sizeof(j)/sizeof(*j)); return 0; }
復制代碼

此方法雖然可以解決問題,但並不是我們需要的,這部分代碼看不出來區別,但工程龐大后,使用引用要比指針高效,所以我們還是要利用引用的特性來解決這個問題。

      將數組形參可聲明為數組的引用,如果形參是數組的引用,編譯器會傳遞數組的引用本身

我們再修改下代碼:如下

復制代碼
#include "stdafx.h" #include<iostream> using namespace std; void PrintValues( int (&ia)[2]) { for (int i = 0; i < 2; i++) { cout << ia[i] << endl; } } int main() { int j[2] = { 0, 1 }; PrintValues(j); return 0; }
復制代碼

結果顯示,與pass by pointer方法結果一致,但是這里有一個缺陷,這里面 int (&ia)[2],編譯器要檢查數組實參和形參的大小。擴展性太差!

復制代碼
#include "stdafx.h" #include<iostream> using namespace std; template<typename T,int N> void PrintValues( T (&ia)[N]) { for (int i = 0; i < N; i++) { cout << ia[i] << endl; } } int main() { int j[2] = { 0, 1 }; PrintValues(j); return 0; }


免責聲明!

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



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