1. 程式人生 > >函式的過載(C++學習筆記 9)

函式的過載(C++學習筆記 9)

C語言不允許過載
  在傳統C語言中,函式名必須是唯一的,也就是說不允許出現同名的函式,
  例如,當要求編寫求整數、長整型數和雙精度數的二次方的函式時,若用C來處理,必須編寫3個函式,這3個函式的函式名不允許同名。例如:
  Isquare( int i );   //求整數的二次方
  Lsquare( long l );  //求長整型數的二次方
  Dsquare( double d );  //求雙精度數的二次方

C++中函式的過載
  在C++中,函式可以過載。即這意味著,只要函式引數的型別不同,或者引數的個數不同,或者兩者都有。當兩個或者兩個以上的函式共用一個函式名時,稱為函式的過載。

被過載的函式稱為過載函式。
過載函式的特點:(1)函式名相同 (2)引數表不同 ( 引數型別,引數個數 )
  例如,當要求編寫求整數、長整型數和雙精度數的二次方的函式時,若用C++來處理,上面用C語言處理中3個求二次方的函式可以起一個共同的名字square,但它們的引數型別仍保留不同。因此,當用戶呼叫這些函式時,只需記住一個square函式,編譯系統就會根據實參的型別來確定呼叫哪個過載函式。
例1: 引數型別不同的過載

#include<iostream>
using namespace std;
int square(int i){
        return i*i;
} long square(long l){ return l*l; } double square(double d){ return d*d; } int main(){ int i=12; long l=1234; double d=5.67; cout<<i<<'*'<<i<<"="<<square(i)<<endl; cout<<l<<'*'<<l<<"="
<<square(l)<<endl; cout<<d<<'*'<<d<<"="<<square(d)<<endl; return 0; }

例2: 引數個數不同的過載

#include<stdio.h>
using namespace std;
int mul(int x,int y){
        return x*y;
}
int mul(int x,int y,int z){
        return x*y*z;
}
int main(){
        int a=1,b=2,c=3;
        printf("%d * %d = %d\n",a,b,mul(a,b));
        printf("%d * %d * %d = %d\n",a,b,c,mul(a,b,c));
        return 0;
}

注意:
(1) int mul(int x, int y); 和 double mul( int x, int y );
這兩個函式的引數個數和引數型別完全相同,只有返回值型別不同,不允許過載。因為編譯系統無法從函式的呼叫形式上判斷哪一個函式與之匹配。

(2)函式的過載與帶預設值的函式一起使用時,有可能引起二義性,比如說,
void Drowcircle( int r=0, int x=0, int y=0 );
void Drowcircle( int r );
當執行函式呼叫: Drowcircle(20);
編譯系統無法確定呼叫哪一個函式。

(3)在函式呼叫時,如果給出的實參和形參型別不相符,C++的編譯器會自動地做型別轉換工作。如果轉化成功,則程式繼續執行,在這種情況下,有可能產生不可識別的錯誤。例如:
void f_a(int x);
void f_a(long x);
雖然這兩個函式滿足函式過載的條件,但是,如果用下面的資料去呼叫,就會出現不可分辨的錯誤:
int c=f_a(5.56);
這是因為編譯器無法確定將5.56轉換成int 還是long 型別的原因造成的。