118 C++中函式的過載
在傳統的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
相關文章
- C++函式過載C++函式
- C++之函式過載C++函式
- C++ 過載運算子和過載函式C++函式
- C++ 函式過載,函式模板和函式模板過載,選擇哪一個?C++函式
- C++ 函式過載和模板C++函式
- C++ 獲取指定的過載函式地址C++函式
- C++入門教程(14):過載函式C++函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- 開心檔之C++ 過載運算子和過載函式C++函式
- JavaScript中的函式過載(Function overloading)JavaScript函式Function
- python中實現函式過載Python函式
- PHP中實現函式過載PHP函式
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- 過載的奧義之函式過載函式
- 在 Python 中實現函式過載Python函式
- TypeScript 函式過載TypeScript函式
- 函式模板過載函式
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- C++中的回撥函式C++函式
- C++中函式呼叫的用法C++函式
- C++中strlen函式C++函式
- 學會TypeScript中函式過載寫法TypeScript函式
- 如何在Python中實現函式過載Python函式
- C++中函式指標與函式物件C++函式指標物件
- Python 函式如何過載?Python函式
- 02-函式過載函式
- [cpp]C++中的解構函式C++函式
- C++ functional庫中的仿函式C++Function函式
- C++中運算子的過載C++
- c++中內建函式C++函式
- js實現函式過載JS函式
- 美麗的閉包,在js中實現函式過載JS函式
- 使用條件型別實現TypeScript中的函式過載型別TypeScript函式
- 關於C++當中的“模板函式”C++函式
- C++中push_back()函式的用法C++函式
- 關於python建構函式的過載Python函式
- c++的remove函式C++REM函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值