[GeekBand] C++ 基礎知識一 ——經過引用傳遞數組

本文參考 : C++ Primer (第四版)  7.2.4及 16.1.5 相關章節ios

                 GeekBand 侯捷老師,學習筆記數組

                 開發環境採用:VS2013版本函數

 

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

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

並且指針最後析構時,要處理內存釋放問題。spa

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

      經過以上分析,咱們設計程序時應該儘可能使用引用,少利用指針。若是非得強調相似,」值傳遞,如」char 類型只有一個字節,請君左轉,屏幕右上角有個紅叉「指針

關鍵問題二:如何傳遞引用

     那麼,傳遞不了指針,咱們傳遞數組怎麼樣?首先看下下面的簡易代碼:(C++ Primer 7.2.4)code

 

#include "stdafx.h"
#include<iostream>
using namespace std;
void PrintValues(const int ia[10])
{
    for (int i = 0; i != 10; i++)
    {
        cout << ia[i] << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int j[2] = { 0, 1 };
    PrintValues(j);
    return 0;
}

 

 

 

 這裏由於編譯器忽略了爲任何數組形參指定長度,因此會形成數組內存越界問題。對象

      並且,數組有二個特性,影響做用在數組上的函數:一是不能複製數組,二是使用數組名時, 數組名會自動指向其第一個元素的指針。由於不能複製,因此沒法編寫使用數組類型的形參,數組會自動轉化爲指針。blog

      咱們驗證下,將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 _tmain(int argc, _TCHAR* argv[])
{
	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 _tmain(int argc, _TCHAR* argv[])
{
	int j[2] = { 0, 1 };
	PrintValues(j);
	return 0;
}

  

  

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

 

最終採用非類型模板解決這個問題,代碼以下:
#include "stdafx.h"
#include<iostream>
using namespace std;

template<class T,int N>
void PrintValues( T (&ia)[N])
{
    for (int i = 0; i != N; i++)
    {
        cout << ia[i] << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int j[2] = { 0, 1 };
    PrintValues(j);
    return 0;
}

 

結果如圖:

 

           

 

 

經過以上分析, 能夠採用非類型模板形參傳遞中來解決效率問題。
相關文章
相關標籤/搜索