官术网_书友最值得收藏!

icon2

1.2 函數

1.函數的定義

一個C程序是由若干個函數組成的,C語言被認為是面向函數的語言,而C++面向過程的程序設計也沿用了C語言使用函數的方法。在C++面向對象的程序設計中,主函數以外的函數大多是被封裝在類中的。主函數或其他函數可以通過類對象調用類中的函數。無論是C還是C++,程序中的各項操作基本上都是由函數來實現的,程序編寫者要根據需要編寫一個個函數,每個函數用來實現某一功能。因此,讀者必須掌握函數的概念以及學會使用和設計函數。

定義函數的一般格式是:


返回值類型 函數名([形參])
{
    函數體
}

在定義函數時函數名后面括號中的變量名稱是形參。在主調中調用一個函數時,函數名后面括號中的參數是實參。

【例1.2】 函數、形參、實參的使用舉例。


#include<iostream>
using namespace std;
int min(int a,int b){               // 這里的min就是函數名,ab是形參,
                              // 返回值是一個int整型
    if(a<b)return a;
    else return b;
}
int main(){
    int a=10,b=1;
    cout<<min(a,b)<<endl;               // 這里的ab是實參
    return 0;
}

函數的執行結果是:


1

例1.2中定義了一個函數,有2個整型的參數,且返回值是整型的,在main函數中調用min函數時,傳入的是實參。

形參與實參的區別是:形參只有被調用時才分配內存單元,在調用結束時,立即釋放所分配的內存單元。實參與形參的類型應相同或賦值兼容。

2.函數重載

C++允許用同一函數名定義多個函數,但這些函數必須參數個數不同或類型不同,這就是函數重載。例1.3說明了函數重載的使用方法。

【例1.3】 求不同類型的數中的最小者。


#include<iostream>
using namespace std;
int min(int a, int b, int c){
    if(a>b)a=b;
    if(a>c)a=c;
    return a;
}
long long min(long long a,long long b, long long c){
                              // 與上面那個函數的差別是參數的類型不同
    if(a>b)a=b;
    if(a>c)a=c;
    return a;
}
double min(double a, double b){          // 這個函數與以上的差別是只有2個參數
    if(a-b>(1e-5))a=b;
    return a;
}
int main(){
    int a=1,b=2,c=3;
    cout<<min(a,b,c)<<endl;
    long long a1=100,b1=200,c1=300;
    cout<<min(a1,b1,c1)<<endl;
    double a2=1.1,b2=2.2;
    cout<<min(a2,b2)<<endl;
    return 0;
}

程序的執行結果是:


1
100
1.1

這里分別需要比較3個整數、3個長整數和2個浮點數,并獲得各組中的最小值。例1.3中分別定義了3個函數,而且函數名都是一樣的,不過參數個數不一樣或者參數類型不一樣,這就是使用了函數重載來實現功能。

在使用函數重載時,同名函數的功能應當相同或相近,不要用同一函數名去實現幾個完全不相干的功能,這樣雖然程序能運行,但是可讀性不好,會讓人覺得莫名其妙。

3.函數模板

函數模板,實際上是建立一個通用函數,其函數類型和形參不具體指定,而用一個虛擬的類型來代表,這個通用函數就是函數模板。凡是函數體相同的函數都可以用這個模板來代替,而不用定義多個函數,實際使用時只需在模板中定義一次就可以了。在調用函數時,系統會根據實參的類型來取代模板中的虛擬類型,從而實現不同函數的功能。

定義函數模板的一般格式是:


template<typename T>

下面的程序說明了函數模板的使用方法。

【例1.4】 函數模板使用舉例。


#include<iostream>
using namespace std;
template<typename T>
T min(T a,T b,T c){
    if(a>b)a=b;
    if(a>c)a=c;
    return a;
}
int main(){
    int a=1,b=2,c=3;
    cout<<min(a,b,c)<<endl;
    long long a1=1000000000,b1=2000000000,c1=3000000000;
    cout<<min(a1,b1,c1)<<endl;
    return 0;
}

程序輸出結果:


1
1000000000

例1.4中定義了一個函數模板,用來獲得3個數中的最小者。若傳入3個整型的,函數就將虛擬類型T轉成int去執行;若傳入3個長整型的,函數就將T轉化成long long去執行。這樣就可以不用定義類型不同的函數了,只需一個函數模板即可搞定。

在編寫函數模板時,可以先寫一個函數,然后把其中的變量類型都替換成虛擬類型即可。可以看到,用函數模板比函數重載更方便,但是它只適用于函數個數相同而類型不同的情況。

主站蜘蛛池模板: 宝兴县| 荣昌县| 亚东县| 西乌珠穆沁旗| 麻江县| 翁牛特旗| 句容市| 康定县| 筠连县| 长治县| 同德县| 桂阳县| 城步| 辽阳市| 宣武区| 易门县| 兴国县| 虞城县| 郓城县| 兰州市| 砀山县| 景宁| 柯坪县| 乌兰浩特市| 徐闻县| 江西省| 台前县| 武威市| 卢氏县| 秦皇岛市| 时尚| 宜宾市| 合水县| 晋城| 井冈山市| 西丰县| 淳安县| 河津市| 云梦县| 涞水县| 海安县|