引數傳遞的三種方式

2021-06-13 06:42:22 字數 2118 閱讀 9312

引數傳遞的三種方式:

按值傳遞

#include

using namespace std;

void swap(int a,int b)

int main()

缺點:記憶體開銷很大。

對於傳遞一般引數:

如果傳遞的參數量過多,例如8000個引數,則需要在棧中複製8000個引數傳遞過去,棧只有2m的空間,這樣的話棧的空間就無法得到充分的利用。

對於傳遞物件:

按址傳遞如果傳遞的是物件的話,傳遞過程中需要複製物件,因此會呼叫複製建構函式,該函式的作用就是建立某個物件的臨時副本。而當函式返回時,傳遞該物件時建立該物件的副本會被刪除,這是會自動呼叫析構函式,而如果返回的仍然是物件的話,並且仍採用按值傳遞的方式,那麼又會呼叫複製建構函式建立乙個物件的臨時複本,當該值成功返回給被呼叫函式時,在呼叫該物件的析構函式刪除臨時拷貝並釋放記憶體。

例如:

#include

using namespace std;

class a

a(a&)

~a()

};a func(a one)

int main()

按址傳遞

#include

using namespace std;

void swap(int *a,int *b)

int main()

解決了按值傳遞的開銷大的缺點,在傳遞物件時:

#include

using namespace std;

class a

a(a&)

~a()

};a func(a *one)

int main()

減少了一次複製構造和析構:

#include

using namespace std;

class a 

a(a&)

~a()

}; a

*func(a *one)

int main()

減少了兩次複製構造和析構: 注:

按址傳遞物件雖然可以避免重複呼叫複製建構函式和析構函式,但是由於它得到了該物件的記憶體位址,可以隨時修改物件的資料,所以它實際上破壞了按值傳遞的保護機制。用const指標來接收物件可以防止任何試圖對該物件所進行的操作行為,並且保證返回乙個不被修改的物件。

例如:

#include

using namespace std;

class a

a(a&)

~a()

void set(int i)

int get()const

private:

int x;

};const a*const func(const a *const one)

int main()

按別名傳遞

#include

using namespace std;

void swap(int &a,int &b)

int main()

因為定義引用的別名就是常量,所以不存在更改其的說法。故可以更好的取代按址傳遞物件。

例如:#include

using namespace std;

class a

a(a&)

~a()

void set(int i)

int get()const

private:

int x;

};const a& func(const a & one)

int main()

{a a;

a.set(11);

a  const &b=func(a);

cout<

Action 引數傳遞的三種方式

qtp提供三種引數傳遞方式 parameter environment datatable parameter 函式傳遞引數 如 分別建立兩個同級別 action outputact 將引數傳遞出來 inputact 獲取 ouputact 傳遞出來的引數 在兩個 action 中設定輸出與輸入引數...

c 引數傳遞的三種方式

在 資料結構與演算法分析 c 描述 第16頁提到了c 中三種不同的引數傳遞方式,分別是 1 按常量引用呼叫 call by constant reference 2 按值呼叫 3 引址呼叫 call by reference 上網查了下資料之後 我還是覺得分成這樣三種更便於理解 1 按值呼叫 形如 ...

函式引數傳遞的三種方式

問題及 1 檔名稱 my first blog.cpp 作 者 林志文 完成日期 2016年9月5日 版 本 號 v1.0 問題描述 交換兩個整型變數的swap函式的三個版本 輸入描述 兩個整數 程式輸出 交換後的兩個整數 includevoid myswap int p1,int p2 void ...