通過使用函數(functions)我們可以把我們的程式以更模組化的形式組織起來,從而利用C++所能提供的所有結構化編程的潛力。
一個函數(function)是一個可以從程式其它地方調用執行的語句塊。以下是它的格式:
type name ( argument1, argument2, ...) statement
- type 是函數返回的資料的類型
- name 是函數被調用時使用的名
- argument 是函數調用需要傳入的參量(可以聲明任意多個參量)。每個參量(argument)由一個資料類型後面跟一個標識名稱組成,就像變數聲明中一樣(例如,int x)。參量僅在函數範圍內有效,可以和函數中的其它變數一樣使用, 它們使得函數在被調用時可以傳入參數,不同的參數用逗號(comma)隔開.
- statement 是函數的內容。它可以是一句指令,也可以是一組指令組成的語句塊。如果是一組指令,則語句塊必須用花括弧{}括起來,這也是我們最常見到情況。其實為了使程式的格式更加統一清晰,建議在僅有一條指令的時候也使用花括弧,這是一個良好的編程習慣
一個函數的例子:
#include <stdio.h>
int add(int a, int b)
{
int r;
r=a+b;
return (r);
}
int main ()
{
int z;
z = add(5,3);
printf("The result is %d\n", z);
return 0;
}
函數參數按地址傳遞:
#include <stdio.h>
void swap(int& a, int& b)
{
int temp =a;
a = b;
b = temp;
}
int main ()
{
int x = 1, y = 3;
printf("begin swap:x=%d,y=%d\n", x, y);
swap(x, y);
printf("after swap:x=%d,y=%d\n", x, y);
return 0;
}
函數參數的預設值:
當聲明一個函數的時候我們可以給每一個參數指定一個預設值。如果當函數被調用時沒有給出該參數的值,那麼這個預設值將被使用。指定參數預設值只需要在函式宣告時把一個數值賦給參數。如果函數被調用時沒有數值傳遞給該參數,那麼預設值將被使用。但如果有指定的數值傳遞給參數,那麼預設值將被指定的數值取代。例如
#include <stdio.h>
int divide(int a, int b=2) {
int r;
r=a/b;
return (r);
}
int main () {
printf("divide(12) = %d\n", divide(12));
printf("divide(20,4) = %d\n", divide(20,4));
return 0;
}
函數重載
兩個不同的函數可以用同樣的名字,只要它們的參量(arguments)的原型(prototype)不同,也就是說你可以把同一個名字給多個函數,如果它們用不同數量的參數,或不同類型的參數。例如:
#include <stdio.h>
int divide(int a, int b) {
return (a/b);
}
float divide(float a, float b) {
return (a/b);
}
int main () {
int x=5,y=2;
float m=5.0, n=2.0;
printf("divide(x, y) = %d\n", divide(x, y));
printf("divide(m, n) = %f\n", divide(m, n));
return 0;
}
inline 函數
inline指令可以被放在函式宣告之前,要求該函數必須在被調用的地方以代碼形式被編譯。這相當於一個宏定義(macro)。它的好處只對短小的函數有效,這種情況下因為避免了調用函數的一些常規操作的時間(overhead),如參數堆棧操作的時間,所以編譯結果的運行代碼會更快一些。
它的聲明形式是:
inline type name ( arguments ... ) { instructions ... }
它的調用和其他的函數調用一樣。調用函數的時候並不需要寫關鍵字inline ,只有在函式宣告前需要寫。