每次函式傳遞,都會重新建立該函式的所有形參,此時將所傳遞的實參初始化對應的形參。
形參可以分為非引用形參和引用形參兩類。
非引用形參:
普通的非引用形參是通過複製對應的實參實現初始化。當用實參的副本初始化形參時,函式並沒有訪問呼叫所傳遞的實參本身,因此不會修改實參的值。(非引用形參表示對應實參的區域性副本。對這類形參的修改僅僅改變了區域性副本的值。一旦函式執行結束,這些區域性變數的值也就不存在了)。
非引用形參之指標形參:可以將指向const
物件的指標初始化為指向
const
物件或非
const
物件;但只能將指向非
const
物件的指標初始化為指向非
const
物件。若函式使用非引用的非const
形參,則既可以給該函式傳遞
const
的實參,也可以傳遞非
const
實參。若函式使用非引用的
const
形參,則在函式中不可改變實參的區域性副本,由於實參仍然是以副本的形式傳遞,因此傳遞給該函式既可以是
const
的實參也可以是非
const
的實參。
編譯器會視const
形參為普通的形參,相容c,在
c中具有
const
形參和具有非
const
形參的函式並無區別。
複製實參的侷限性,不適應複製實參的情況包括:
1>當需要在函式中修改實參的值時;
2>當需要以大型物件作為實參傳遞時,複製實參付出的時間和儲存空間的代價很大;
3>當沒有辦法實現物件的複製時。
引用形參
與所有引用一樣,引用形參直接關聯到其所繫結到的物件,而並非這些物件的副本。引用物件必須用與該引用繫結的物件初始化該引用。
使用引用形參不僅可以修改實參的值,還可以返回額外的資訊——當函式有不止乙個內容需要返回時。
利用const
引用避免複製
如果使用引用形參的唯一目的是避免複製實參,則應將形參定義為const
型別(不能通過該引用修改實參)。
更靈活的指向const
的引用如果函式具有普通的非const
引用形參,則顯然不能用
const
實參進行呼叫。且呼叫這樣的函式,傳遞乙個右值和具有需要轉換的型別的物件是不允許的。非const
引用形參只能用完全同型別的非
const
物件關聯。
應該將不需要修改相應實參的形參定義為const
引用。如果將這樣的形參定義為非const
引用,則毫無必要地限制了該函式的使用。
傳遞指向指標的引用
void swap(int *&v1, int *&v2)
形參int *&v1
從右至左理解:首先
v1是乙個引用,與指向
int型物件的指標關聯。
通常,函式不應該有vector
和其他標準庫容器型別的形參。呼叫含有普通的非引用
vector
形參的函式將會複製
vector
的每乙個元素。從避免複製
vector
的角度出發,應將形參宣告為引用型別。事實上,
c++程式設計師傾向於通過傳遞指向容器中需要處理的元素的迭代器來傳遞容器。
陣列形參
陣列的兩個特殊性質:一是不能複製陣列;二是使用陣列名字時,陣列名會自動轉換為指向陣列第乙個元素的指標。
陣列形參定義的方式有三種:例如 void fun(int a[10]) ; void fun(int *a) ; void fun(int a);
通常將陣列形參定義為指標要比使用陣列語法更好。這樣就明確表明函式操縱的是指向陣列元素的指標,而不是陣列本身。當編譯器檢查陣列形參關聯的實參時,它只會檢查該實參是不是指標,指標的型別和陣列元素的型別是否匹配,而不會檢查陣列的長度。
陣列實參
在傳遞陣列時,陣列實參是指向陣列第乙個元素的指標,形參複製的是這個指標的副本,而不是陣列元素本身。函式操縱的是指標的副本,而不會修改實參指標的值。然而,可以通過該指標改變它所指向的陣列元素的值。
通過引用傳遞陣列
如果形參是陣列的引用,編譯器不會將陣列實參轉化為指標,而是傳遞陣列的引用本身。這種情況下陣列的大小成為形參和實參型別的一部分。編譯器會檢查陣列大小和形參的大小是否匹配。
多維陣列的傳遞
c++沒有多維陣列,所謂多維陣列實際是陣列的陣列。多維陣列的元素本身就是陣列,除了第一維以外的所有維的長度都是元素型別的一部分。多維陣列形參定義:
例如void fun(int (*a)[10], int rowsize); void fun(int a[10], int rowsize);
前乙個語句宣告a
為乙個指向有10個
int型元素的指標;後乙個語句用陣列語法定義了多維陣列,並忽略了第一維的長度。
傳遞給函式的陣列的處理
有三種常見的程式設計技巧確保函式的操作不超出陣列實參的邊界:
第一種方法就是在陣列本身放置乙個標記來檢測陣列的結束。c
風格字串就是採用這種方法的乙個例子,它是乙個字元陣列,並以空字元
null
作為結束的標記。
第二種方法就是傳遞指向陣列第乙個元素和最後乙個元素的下乙個位置的指標。
第三種方法就是將第二個形參定義為表示陣列的大小。
注意在標準c++
中定義或宣告函式時,沒有顯式指定返回值型別是不合法的。
但在c中,如果函式返回值是
int型別,返回值型別可以省略,而且可以不用顯式宣告該函式。
函式引數傳遞 c 學習
每次函式傳遞,都會重新建立該函式的所有形參,此時將所傳遞的實參初始化對應的形參。形參可以分為非引用形參和引用形參兩類。非引用形參 普通的非引用形參是通過複製對應的實參實現初始化。當用實參的副本初始化形參時,函式並沒有訪問呼叫所傳遞的實參本身,因此不會修改實參的值。非引用形參表示對應實參的區域性副本。...
c 函式引數傳遞
void reset int num void creset const int num void preset int p void cpreset const int p void rreset int arr 10 void initiaresert initializer listlist ...
C 函式引數傳遞方式
引數傳遞有三種方式 值傳遞 pass by value 指標傳遞 pass by pointer 引用傳遞 pass by reference 程式測試 include stdafx.h include using namespace std 值傳遞 pass by value void fun1 ...