118 C++中函式的過載

phpstory發表於2018-08-20

在傳統的C語言中,函式名必須是唯一的,也就是說在同一作用域中,不允許出現同名的函式。

例如:   要求編寫求整數、浮點數和雙精度數的平方數的函式。  

在傳統的C語言中:  

Isquare(int i);    //求整數的平方數  

Fsquare(float f); //求浮點數的平方數

Dsquare(double d);//求雙精度數的平方數

在C++中,允許兩個或者兩個以上的函式共用一個函式名。

例如:   square(int i);    //求整數的平方數  

square(float f); //求浮點數的平方數

square(double d);//求雙精度數的平方數

函式過載:當兩個或者兩個以上的函式共用一個函式名時,稱為函式過載。
被過載的函式稱為過載函式。
過載函式應在引數個數或引數型別上有所不同,或者二者兼而有之

舉例:
 

#include<iostream>
using namespace std;
int square(int i) { return i * i; }
float square(float f) { return f * f; }
double square(double d) { return d * d; }
int main()
{
    int i = 12;
    float f = 3.4;
    double d = 5.67;
    cout << i << "*" << i << "=" << square(i) << endl;
    cout << f << "*" << f << "=" << square(f) << endl;
    cout << d << "*" << d << "=" << square(d) << endl;
    return 0;
}
執行結果:
12*12=144
3.4*3.4=11.56
5.67*5.67=32.1489
#include<iostream>
using namespace std;//引數個數不同的函式過載
int add(int x, int y) { return x + y; }
int add(int x, int y, int z) { return x + y + z; }
int main()
{
	int a = 3, b = 4, c = 5;
	cout << a << "+" << b << "=" << add(a, b) << endl;
	cout << a << "+" << b <<"+"<<c<< "=" << add(a, b,c) << endl;
	return 0;
}
執行結果:
3+4=7
3+4+5=12

說明:

(1)若兩個函式的引數個數和型別都相同,而只有返回值型別不同,則不允許過載。

例如:     int mul(int x,int y);     double mul(int x,int y);

雖然這兩個函式的返回值型別不同,但是引數個數和型別完全相同,編譯程式將無法區分這兩個函式。        

   overloaded function differs only by return type from 'int __cdecl mul(int,int)'

(2) 函式的過載與帶預設值的函式一起使用時,有可能引起二義性,例如:

void Drawcircle(int r=0, int x=0, int y=0);

void Drawcircle(int r);    

當執行以下的函式呼叫時:   Drawcircle(20);   時,編譯無法確定使用哪一個函式。    

‘Drawcircle’ : ambiguous call to overloaded function        

void Drawcircle(int r, int x, int y)//不帶預設值  

  {     cin>>r>>x>>y;cout<<r<<x<<y;}    

void Drawcircle(int r)  

  {     cout<<r;} 

(3) 在函式呼叫時,如果給出的實參和形參型別不相符,C++的編譯器會自動地做型別轉換工作。如果轉換成功,則程式繼續執行。

但是,在這種情況下,有可能產生不可識別的錯誤。

例如,有兩個函式的原型如下:      

void f_a(int x);  

  void f_a(long x);    

如果我們用下面的資料去呼叫,就會出現不可識別的錯誤:      

 int c=f_a(5.56);

編譯器無法確定將5.56轉換成int還是long型別

 

更多內容歡迎關注微信訂閱號:phpstory

相關文章