函数的重载
函数的重载
C++ 里的函数重载(overloading)机制比我们此前见到的东西都高深,这种语言的灵活性和强大功能在它身上体现得淋漓尽致。
所谓函数重载的实质就是用同样的名字再定义一个有着不同参数但有着同样用途的函数。(人格分裂、多重身份……)
注意:可以是参数个数上的不同,也可以是参数数据类型上的不同!
实例演示:convertTemperature.cpp
1 #include <iostream> 2 3 void convertTemperature(double tempIn, char typeIn); 4 5 int main() 6 { 7 double tempIn; 8 char typeIn; 9 10 std::cout << "请以【xx.x C】或【xx.x F】的形式输入温度: "; 11 std::cin >> tempIn >> typeIn; 12 std::cin.ignore(100, '\n'); 13 std::cout << "\n"; 14 15 convertTemperature(tempIn, typeIn); 16 17 return 0; 18 } 19 20 void convertTemperature(double tempIn, char typeIn) 21 { 22 const unsigned short ADD_SUBTRACT = 32; 23 const double RATIO = 9.0 / 5.0; 24 25 float tempOut; 26 char typeOut; 27 28 switch( typeIn ) 29 { 30 case 'C': 31 case 'c': 32 tempOut = (tempIn * RATIO) + ADD_SUBTRACT; 33 typeOut = 'F'; 34 typeIn = 'C'; 35 break; 36 37 case 'F': 38 case 'f': 39 tempOut = (tempIn - ADD_SUBTRACT) / RATIO; 40 typeOut = 'C'; 41 typeIn = 'F'; 42 break; 43 44 default: 45 typeOut = 'E'; 46 break; 47 } 48 49 if( typeOut != 'E' ) 50 { 51 std::cout << tempIn << typeIn << " = " << tempOut << typeOut << "\n\n"; 52 } 53 else 54 { 55 std::cout << "请按照给出格式输入!" << "\n\n"; 56 } 57 58 std::cout << "请输入任意字符结束!" << "\n"; 59 std::cin.get(); 60 }
按照思路,我们自己试着来动手实现第一个函数的重载:convertTemperature_2.cpp
1 #include <iostream> 2 3 void convertTemperature(double tempIn, char typeIn); 4 void convertTemperature(int tempIn, char typeIn); 5 6 int main() 7 { 8 double tempIn; 9 int tempInInt; 10 char typeIn; 11 12 std::cout << "请以【xx.x C】或【xx.x F】的形式输入温度: "; 13 std::cin >> tempIn >> typeIn; 14 std::cin.ignore(100, '\n'); 15 std::cout << "\n"; 16 convertTemperature(tempIn, typeIn); 17 18 std::cout << "请以【xx C】或【xx F】的形式输入温度: "; 19 std::cin >> tempInInt >> typeIn; 20 std::cin.ignore(100, '\n'); 21 std::cout << "\n"; 22 convertTemperature(tempInInt, typeIn); 23 24 return 0; 25 } 26 27 void convertTemperature(double tempIn, char typeIn) 28 { 29 const unsigned short ADD_SUBTRACT = 32; 30 const double RATIO = 9.0 / 5.0; 31 32 double tempOut; 33 char typeOut; 34 35 switch( typeIn ) 36 { 37 case 'C': 38 case 'c': 39 tempOut = (tempIn * RATIO) + ADD_SUBTRACT; 40 typeOut = 'F'; 41 typeIn = 'C'; 42 break; 43 44 case 'F': 45 case 'f': 46 tempOut = (tempIn - ADD_SUBTRACT) / RATIO; 47 typeOut = 'C'; 48 typeIn = 'F'; 49 break; 50 51 default: 52 typeOut = 'E'; 53 break; 54 } 55 56 if( typeOut != 'E' ) 57 { 58 std::cout << tempIn << typeIn << " = " << tempOut << typeOut << "\n\n"; 59 } 60 else 61 { 62 std::cout << "请按照给出格式输入!" << "\n\n"; 63 } 64 65 std::cout << "请输入任意字符结束!" << "\n"; 66 std::cin.get(); 67 } 68 69 void convertTemperature(int tempIn, char typeIn) 70 { 71 const unsigned short ADD_SUBTRACT = 32; 72 const double RATIO = 9.0 / 5.0; 73 74 int tempOut; 75 char typeOut; 76 77 switch( typeIn ) 78 { 79 case 'C': 80 case 'c': 81 tempOut = (tempIn * RATIO) + ADD_SUBTRACT; 82 typeOut = 'F'; 83 typeIn = 'C'; 84 break; 85 86 case 'F': 87 case 'f': 88 tempOut = (tempIn - ADD_SUBTRACT) / RATIO; 89 typeOut = 'C'; 90 typeIn = 'F'; 91 break; 92 93 default: 94 typeOut = 'E'; 95 break; 96 } 97 98 if( typeOut != 'E' ) 99 { 100 std::cout << tempIn << typeIn << " = " << tempOut << typeOut << "\n\n"; 101 } 102 else 103 { 104 std::cout << "请按照给出格式输入!" << "\n\n"; 105 } 106 107 std::cout << "请输入任意字符结束!" << "\n"; 108 std::cin.get(); 109 }
这个例子,我们可以体验到:对函数进行重载,事实上可以简化编程工作和提高代码可读性。
大家想必已经体会到重载的优越性了,事实上,重载不是一个真正的面向对象特征,它只是可以简化编程工作的一种方案,而简化工作正式C++ 语言的全部追求。
有以下几点需要大家注意的:
对函数(方法)进行重载一定要谨慎,不要“无的放矢”或“乱点鸳鸯”;
要知道重载函数越多,该程序就越不容易看懂;
注意区分重载和覆盖(覆盖后边我们会讲到);
我们只能通过不同参数进行重载,但不能通过不同的返回值(尽管后者也是一种区别);
最后,对函数进行重载的目的是为了方便对不同数据类型进行同样的处理。
为什么不能通过返回值不同来重载函数(方法)呢?
利用重载函数的方法设计一个程序,改程序通过函数”calc()”进行计算并返回显示结果。
当传入一个参数时,计算该参数的平方值;
当传入两个参数时,计算两个参数的积;
当传入三个参数时,计算三个参数的和。