C++入門(5):定義個人函數
函數定義
函數原型通常安排在main()函數的定義之前;
定義函數時,可以給輸入參數設置默認值,讓這個參數成爲可選的,但有一點必須注意:必須把所有的必選參數放在可選參數之前!!
內聯函數
創建內聯函數最直接的辦法是使用 inline 關鍵字並在 main() 函數的前面定義它,所以內聯函數不需要先爲它定義原型;
某個函數被編譯器當做內聯函數來處理最直接的效果是:這個函數的調用將被替換爲實際的函數代碼,就像那些代碼是寫在main()函數裏一樣;
但是,即使使用了inline關鍵字,函數也並非肯定會被當做一個內聯函數來對待。
函數的重載
一般來說,重載的函數最適用於需要對不同的數據類型進行相同處理的場合;我們無法通過只改變函數返回值的類型而重載一個函數。
如果只是想讓一個參數能夠接受(比如)兩個或三個輸入參數,把第三個輸入參數定義爲可選參數(讓它有一個默認值)即可。
變量作用域
繞開變量作用域的辦法之一是在發出函數調用時按引用傳遞;
函數內部的變量可以被聲明爲 static(靜態) 的,函數內部的靜態變量的值在程序的生命週期內即使經歷多次函數調用也不會被自動重置,但它仍然是局部的。
#include <iostream>
void testStatic()
{
static int count = 0; //在子函數中定義靜態變量病初始化爲0
count++; //以後每調用一次此函數,靜態變量值加1,並打印其值
std::cout << "count = " << count << std::endl;
}
int testMax(int a, int b, int c = 10)
{
if(10 == c) //有一個默認的第三參數,如果第三個參數爲默認,即爲比較兩個數中最大的
{
return (a>b?a:b);
}
else
{
if(a > b && a > c )
{
return a;
}
else if(b > a && b > c)
{
return b;
}
else
{
return c;
}
}
}
int main(int argc, char** argv) {
int max;
max = testMax(3,7); //兩個參數時的情況
std::cout << "max = " << max << std::endl;
testStatic();
testStatic();
testStatic();
return 0;
}
運行結果爲
max = 7
count = 1
count = 2
count = 3 //每次調用testStatic(),count值加1
如果在main()函數中加入std::cout << count;
則會出錯,因爲雖然多次調用函數時,函數內部的靜態變量不會被重置,但它仍然是局部的,主程序不能識別。