所謂函式的型別,其實就是函式傳回值的型別。 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 中
}