C++函數的重載
課題目的
學生通過本課了解函數重載的優點,掌握並熟用函數重載。
課題引入
由例題引入函數重載
1)函數重載的數據類型
例題
編寫函數求不同的數據類型(int型,float型,double型)的絕對值
以前解法為依次將int型,float型,double型的對應函數打出
int abs1(int x) { if (x<0) x=-x ; return x ;} float abs2(float x) { if (x<0) x=-x ; return x ;} double abs3(double x) { if (x<0) x=-x ; return x ;} int main() { cout<<abs1(-1)<<abs2(-1.0f)<<abs3(-1.0); return 0; }
觀察以上三條函數,發現除了數據類型之外,完全完全相同,然而需要三個函數來實現其功能。
討論:這樣做有些什么缺點
答:編寫起來麻煩,更何況功能接近,受數據類型的干擾,太多的函數名麻煩 >>>>>可讀性太低
如果使用函數重載的話,例題應這樣書寫:
int abs(int x) { if (x<0) x=-x ; return x ;} float abs(float x) { if (x<0) x=-x ; return x ;} double abs(double x) { if (x<0) x=-x ; return x ;} int main() { cout<<abs(-1)<<abs(-1.0f)<<abs(-1.0); return 0; }
如上可見,這樣做減少了函數名的數量,避免了名字空間的污染,對於程序的可讀性有很大的好處。
2)函數重載的元素個數
閱讀以下代碼,談談函數重載的特別處:
void f() { cout<<"1"<<endl; } void f(int x) { cout<<"2"<<endl; } void f(int x,int y) { cout<<"3"<<endl; } int main() { f(); f(1); f(3,4);return 0; }
如上可見,可以實現重載函數多個參數數目種類的使用,這樣使函數功能更能滿足多個元素。
綜上所述 :
函數重載的特點
1)函數的參數個數不同。
2)函數的參數類型不同或者參數類型順序不同。
函數重載的優點
1)函數重載方便在后期動態調用。便於擴充方法內容,可以少寫重復代碼。
2)函數重載也讓函數多態,讓函數可以對於多種多個參數的相似功能的實現。
函數重載的使用
函數重載時需要對函數的各種情況以同樣的函數名進行聲明。
如下列代碼
#include<iostream> using namespace std; int add();//分別對函數進行聲明 int add(int a); int add(double a); double add(int a,double b); int main() { add(); add(5); add(2.0); add(1,2.0); return 0; } int add() { return 1+2; } int add(int a) { return a+2; } int add(double a) { return a+2; } double add(int a,double b) { return a+b; }
課題實驗
編寫一函數,能求兩個或三個整數或實數的最大值。
解題思路:將兩個整數,三個整數,兩個實數,三個實數的四種可能的函數通過函數重載以max函數來尋找其最大值,而解決三個參數的最大值獲取時可以利用已寫出的兩個參數求最大值函數
1 #include<iostream> 2 using namespace std; 3 int max(int i, int j);//重載函數 4 int max(int i, int j, int k);//不同參數數目 5 double max(double i, double j);//不同參數類型 6 double max(double i, double j, double k); 7 int max(int i, int j) 8 { 9 return i > j ? i : j; //如果i大於j 返回i,否則返回j; 10 } 11 12 int max(int i, int j, int k) 13 { 14 return max( max(i, j), k); //線比較i和j,最后比較k 15 } 16 17 double max(double i, double j) 18 { 19 return i > j ? i : j; //如果i大於j 返回i,否則返回j; 20 } 21 22 double max(double i, double j, double k) 23 { 24 return max( max(i, j), k); //線比較i和j,最后比較k 25 } 26 27 int main() 28 { 29 cout<<max(1,5) <<" "<<max(1.5,0.9)<<" "<<max(5,3,7)<<" " 30 <<max(5.1,3.1,7.5)<<endl; 31 return 0; 32 }
