7-2 認識引數傳遞
c++的函式可分為系統本身提供的標準函式和使用者自行定義的函式兩種。
//例如:
#include
自定義函式是由函式名稱、引數、返回值與返回資料型別組成的,
基本語法格式如下:
返回資料型別 函式名稱(引數行)
示例:
#include
#include
using
namespace std;
intadd_fun
(int a,
int b)
c++的自定義函式可分為宣告與定義兩個部分。
任何自定義函式在被呼叫與使用前都必須先經過宣告過程,否則在編譯過程中將發生錯誤。
比如下面兩段程式**是相同的:
int
add_fun
(int a,
int b)
//直接定義函式在main()之前
intmain()
//函式原型宣告
intadd_fun
(int a,
int b)
;int
main()
//直接定義函式在main()之後
intadd_fun
(int a,
int b)
函式引數的種類可以分為以下兩種:
//形式引數
void
add_numfun
(int add_num)
void
main
(void
)//實際引數
add_numfun(10
)
所謂傳值呼叫(call by value),是指主程式呼叫函式的實際引數時系統會將實際引數的數值傳遞並複製給函式中相對應的形式引數。
//傳值呼叫函式宣告
返回資料型別 函式名稱(資料型別 引數1
,引數2,.
..)//或
返回資料型別 函式名稱(資料型別 ,資料型別 ,資料型別 ,..
.)//傳值呼叫函式呼叫形式
函式名稱( 引數1
,引數2,.
..);
函式的傳址呼叫(call by address)表示在呼叫函式時系統並沒有分配實際的位址給函式的形式引數,而是將實際引數的位址直接傳遞給所對應的形式引數。
傳址方式的函式宣告形式如下:
返回資料型別 函式名稱(資料型別 *引數1
,資料型別 *引數2,...
);//或返回資料型別 函式名稱(資料型別 *
, 資料型別 *,.
..)//傳址呼叫的函式呼叫形式
函式名稱(
&引數1
,&引數2,.
..);
傳引用方式也是類似於傳址呼叫的一種,但是在傳引用方式的函式中形式引數並不會另外分配記憶體來存放實際引數傳入的位址,而是直接把形式引數作為實際引數的乙個別名(alias)。
傳引用方式的函式宣告形式如下:
返回資料型別 函式名稱(資料型別 &引數1
,資料型別 &引數2,...
);//或返回資料型別 函式名稱(資料型別 &
, 資料型別 &,.
..)//傳址呼叫的函式呼叫形式
函式名稱(引數1
, 引數2,.
..);
設定引數預設值的函式原型宣告以及函式定義方式:
//函式原型宣告
函式型別 函式名稱(資料型別1 變數1,.
..,資料型別n 變數名稱n = 預設值)
;//函式定義
函式型別 函式名稱(資料型別1 變數1,.
..,資料型別n 變數名稱n)
陣列傳遞時所傳遞的就是陣列位址,也就是指向陣列位址的指標(pointer)。如果在函式中改變了陣列內容,那麼所呼叫主程式中的陣列內容也會隨之改變。
不過,由於陣列大小是根據所擁有的元素個數而定的,因此在陣列引數傳遞時最好能另外傳送陣列大小的引數。
一維陣列引數傳遞的函式宣告如下:
//方式 1 :
(返回資料型別 or
void
) 函式名稱 (資料型別 陣列名[
],資料型別 陣列大小...
);//方式二:
(返回資料型別 or
void
) 函式名稱 (資料型別 陣列名[
],資料型別* 陣列大小...
);
一維陣列引數傳遞的函式呼叫如下:
函式名稱 (資料型別 陣列名,資料型別 陣列大小...
);
二維陣列引數傳遞的函式宣告形式如下:
(返回資料型別 or
void
) 函式名稱 (資料型別 陣列名[
][列數]
,資料型別 行數 , 資料型別 列數...
);//或(返回資料型別 or
void
) 函式名稱 (資料型別 陣列名[行數]
[列數]
,資料型別 行數 , 資料型別 列數...
);
二維陣列引數傳遞的函式呼叫如下:
函式名稱 (資料型別 陣列名,資料型別 行數 , 資料型別 列數...
);
案例:
#include
#include
using
namespace std;
void
print_arr
(int arr[
5],int
,int);
intmain()
,};print_arr
(score_arr,2,
5);system
("pause");
return0;
}void
print_arr
(int arr[
5],int r,
int c)
printf
("\n");
}}
返回指標的函式原型宣告語法如下:
返回資料型別 *函式名稱(資料型別 引數1
,資料型別 引數2,...)
案例:
#include
#include
using
namespace std;
char
*strcat
(char*,
char*)
;//字串串接函式原型的宣告
intmain
(void
)//自變數:str1與str2串接
//返回值:返回串接結果str1
char
*strcat
(char
* str1,
char
* str2)
//返回值為字串指標
*(str1 + i + j)
='\0'
;//記得加上空字元
return str1;
}
第7章 函式 7
7.7 類的成員函式 函式原型必須在類中定義。但是,函式體則既可以在類中也可以在類外定義。7.7.1 定義成員函式的函式體 類的所有成員都必須在類定義的花括號裡面宣告,此後,就不能再為類增加任何成員。類的成員函式必須加宣告的一般定義。類的成員函式既可以在類的定義內也可以在類的定義外定義。編譯器隱式地...
第7章 函式 4
7.2.5 傳遞給函式的陣列的處理 非引用陣列形參的型別檢查只是確保實參是和陣列元素具有同樣型別的指標,而不會檢查實參實際上是否指向指定大小的陣列。任何處理陣列的程式都要確保程式停留在陣列的邊界內。第一種方法是在陣列本身放置乙個標記來檢測陣列的結束,c風格字串是一種字元陣列,並且以空字元null作為...
第7章 函式 6
7.5 區域性物件 在函式中定義的形參和變數的名字只位於函式的作用域中 這些名字只在函式體中可見。通常,變數名從宣告或定義的地方開始到包圍它的作用域結束處都是可用的。7.5.1 自動物件 只用當定義它的函式被呼叫時才存在的物件稱為自動物件 automatic object 自動物件在每次呼叫函式時建...