函数重载的定义:
函数的重载简要的来说,便是一个作用域和三个不同,即同一作用域内的一组函数的函数名相同,参数列表不同,参数个数不同和参数类型不同(函数的返回值可同可不同)
函数重载的作用
重载函数通常用来在同一个作用域内用同一个函数名,命名一组功能相似的函数,这样做减少了函数名的数量,避免了命名空间的污染,对于程序的可读性有很大的好处
函数重载是一种静态多态
多态:用同一个东西表示不同的形态
多态分为: 静态多态(编译时的多态)和动态多态(运行时的多态)
而函数重载是一种静态多态
函数重载的原理
编译器在编译.cpp文件的过程中使用作用域里的同名函数时,会自动根据函数形参的类型和顺序会对函数进行重命名(不同的编译器在编译时对函数的重命名标准不一样),但是总的来说,他们都把文件中的同一个函数名进行了重命名
在VS编译器中: 根据返回值类型(不起决定性作用)+形参类型和顺序(起决定性作用)的规则重命名并记录在map文件中
函数重载的优势
重载不是一个真正的面向对象特征,他只是可以简化编程工作的一种方案,而简化工作正是C++语言的全部追求,对函数进行重载的目的就是方便对不同数据类型进行同样处理简化编程工作和提高代码的可读性
案例一 利用重载函数 中 函数参数个数的不同 用同名函数 对不同的形参数目进行区别计算

设置函数并赋予不同的形参数量 进行 函数的重载

重载函数们的具体功能编译

运行结果

具体代码
案例一 同一函数 不同形参类型之间 进行函数重载
#include <iostream>
using namespace std;
void convertTemperature(double tempIn, char typeIn);
int main()
{
double tempIn;
int tempInINT;
char typeIn;
cout << "请以xx.c或xx.f的格式输入一个温度" << endl;
cin >> tempIn >> typeIn;
cin.ignore(100, '\n');
cout << "\n";
convertTemperature(tempIn, typeIn);
cout << "请以xx.c或xx.f的格式输入一个温度" << endl;
cin >> tempInINT >> typeIn;
cin.ignore(100, '\n');
cout << "\n";
convertTemperature(tempInINT, typeIn);//函数重载输入参数为int类型的tempInINT
//从输入两个不同类型的温度数据可以看出 对函数进行重载 事实上可以简化编程工作和提高代码的可读性
//todo重载不是一个真正的面向对象特征 他只是可以简化编程工作的一种方案 而简化工作正是C++语言的全部追求
//todo只能通过不同参数进行重载 但不能通过不同 的返回值 (尽管后者也是一种区别)
//todo对函数进行重载的目的 方便对不同数据类型进行同样处理
return 0;
}
void convertTemperature(double tempIn, char typeIn)
{
//todo编写一个温度单位转换程序 提示用户以 xx.c 或 xx.f的格式输入
//todo华氏温度==摄氏温度 *9.0/5.0+32.0 ;
const unsigned short ADD = 32;
const double RATIO = 9.0 / 5.0;
double tempout;
char typeOut;
switch (typeIn)
{
case 'C':
case 'c':
tempout = tempIn * RATIO + ADD;
typeOut = 'F';
typeIn = 'C';
break;
case 'F':
case 'f':
tempout = (tempIn - ADD) / RATIO;//逆运算
typeOut = 'C';
typeIn = 'F';
break;
default:
tempout = 'E';
cout << "输入格式有误" << endl;
break;
}
if (tempout != 'E')
{
cout << "输入温度信息为" << tempIn << typeIn << "转换后的温度信息为" << tempout << typeOut << endl;
}
else
{
cout << "输入信息有误 检查一下" << endl;
}
}
void convertTemperature(int tempInINT, char typeIn)
{
//todo编写一个温度单位转换程序 提示用户以 xx.c 或 xx.f的格式输入
//todo华氏温度==摄氏温度 *9.0/5.0+32.0 ;
const unsigned short ADD = 32;
const double RATIO = 9.0 / 5.0;
double tempout;
char typeOut;
switch (typeIn)
{
case 'C':
case 'c':
tempout = tempInINT * RATIO + ADD;
typeOut = 'F';
typeIn = 'C';
break;
case 'F':
case 'f':
tempout =(tempInINT - ADD) / RATIO;//逆运算
typeOut = 'C';
typeIn = 'F';
break;
default:
tempout = 'E';
cout << "输入格式有误" << endl;
break;
}
if (tempout != 'E')
{
cout << "输入温度信息为" << tempInINT << typeIn << "转换后的温度信息为" << tempout << typeOut << endl;
}
else
{
cout << "输入信息有误 检查一下" << endl;
}
}
案例二 利用重载函数 中 函数参数个数的不同 用同名函数 对不同的形参数目进行区别计算
#include <iostream>
using namespace std;
//todo当同一函数名的参数个数出现不同 需要根据参数个数的不同进行函数声明 (如果参数个数没变 仅是参数类型出现变换 则只需要声明一次函数)
void convertTemperature(float num1);
void convertTemperature(float num1, float num2);
void convertTemperature(float num1, float num2, float num3);
int main()
{
while(1)//重复循环进行数组输入和计算
{
//设置三个浮点型变量 为convertTemperature函数的形参
float num1=0, num2=0, num3=0;
cout << endl;
cout << "请输入任意个数的值" << endl;
cin >> num1 >> num2 >> num3;
//由于这个案例中 每次输入的数组个数并不一致 就需要对输入流进行输入读取完毕的判断 按下Ctrl+Z 或者 Ctrl+D两个结束标志就能随意的截取任意数量的数组(前提是数组之间得用空格符分开)
//todo注意:Ctrl+Z 或者 Ctrl+D两个结束符 虽然cin读到文件结束符会会变为false,跳出循环 但是整个程序也会随之结束!
cin.ignore(100, '\n');//todo使用输入流忽略法 去除回车符对输入数据的影响(去除按下回车键时 包括此回车键中的前一百个流数据)
cout << endl;
if (num1 != 0&&num2==0&&num3==0)//调用条件
{
convertTemperature(num1);//todo第一次调用函数 形参数目为1
}
if (num1 != 0&& num2 != 0&&num3==0)
{
convertTemperature(num1, num2); // todo第一次函数重载 形参数目为2
}
if (num1 != 0 && num2 != 0 && num3 != 0)
{
convertTemperature(num1, num2, num3);//todo第二次函数重载 形参数目为3
}
}
return 0;
}
void convertTemperature(float num1)
{
float result = num1 * num1;
cout << "输出的结果为" << result << endl;
}
void convertTemperature(float num1, float num2)
{
float result = num1 +num2;
cout << "输出的结果为" << result << endl;
}
void convertTemperature(float num1, float num2, float num3)
{
float result = num1 + num2+num3;
cout << "输出的结果为" << result << endl;
}
本文介绍了C++中的函数重载,包括其定义、作用、静态多态性质和实现原理。函数重载允许在同一作用域内使用相同的函数名但通过不同的参数列表来区分不同的函数,从而提高代码可读性和简化编程工作。文章还提供了具体的代码示例来展示函数重载的应用。
942

被折叠的 条评论
为什么被折叠?



