所謂函式的型別,其實就是函式傳回值的型別。 retuen 是用來使函式結束以返回原呼叫程式的指令。 在函式中,一執行到 retuen 該函式便立即結束並返回原呼叫程式。 retuen 除了可以使函式返回之外,還可以把函式內的資料傳回給呼叫程式:
int func1( ... ) { int y; int i,j; char *k; y=func2(i,j,k); //傳入引數值 .... ... } int func2(int r, int s, char *t) // 注意引數型別要一致 { ..... .... return x; //傳回 x 值並存入 y 中 }
函式的型別可以是:
✦ 基本型別:如 int、double、long 等。
✦ 衍生型別:如 int &、char * 等,但不可以為陣列。
✦ 自定型別:如 enum、struct、class 等。
✦ void:無傳回值。
若不指定函式型別,則預設為 int 型別,但函式的原型宣告是在其他函式中做的,則函式型別不可省,否則會被誤認為是在做函式呼叫。 除了 void 型別的函式外,我們都必須用 retuen 來結束函式並傳回一型別相符的值,如果傳回值和函數型別不符,則 compiler 會做自動的型別轉換,當無法轉換時則產生 Compile-Time 的錯誤。
注意,陣列型別不可做為傳回值,必須改用指位器的方式傳回:
#include <iostream.h> void main() { char s[300]; char *UpperStr(char *str); //函式要加以宣告 cout << "Please input a string: \n"; cin >> s; cout << UpperStr(s); } char *UpperStr(char *str) { char *p=str; //p 指向字串的開頭 while(*p) { if(*p>='a' && *p<='z') *p -= 'a'-'A'; p++; //使 p 指向下一個字元 } return str; //以 return 傳回 str 的位址值 }
執行結果:
Please input a string: abcd1234efg@#$% ABCD1234EFG@#$%
UpperStr() 以 if(s>=’a’ && s<=’z’) 來判斷字串內的字元值是否介於小寫字母 a 至 z 的 ASCII 值之間,若是則減去大小寫字母的 ASCII 值差額以轉換成大寫。
若函式的傳回值是一個參考型別,那麼傳回的將是一個物件的 lvalue 值,如下例:
int &funct(int *arr) { arr[0]++; return arr[0]; } void main() { int i, a[5]; a[0]=1; i=funct(a)++; //在函式返回之後,funct(a) 將成為 arr[0],也就是 a[0] 的別名。 所以函式返回后的運算相當於 i=a[0]++ cout << i << ',' << a[0]; //結果印出 2,3 }
還有一點需要注意,當函式的傳回值是指位器或參考型別時,其所參用到的變數不可以是函式中暫用的變數:
int *funct(int a) //被呼叫時由堆疊中配置變數 a { return &a; //變數 a 在函式結束時就不存在了 } void main() { int *p; p=funct(2); *p=6; //錯誤:將 6 存入已不存在的變數 a 中 }