什么是函数重载
函数重载就是为了实现同一个函数对于不同类型,个数或者顺序的输入参数都可以正常的运行。
重载函数的参数个数、参数类型、参数顺序 三者中必须至少有一种不同(不然会产生调用疑惑)。函数的返回值类型可以相同也可以不同。
上述对于函数重载的要求,我们可以举一个反面例子。比如下面的int max_num(int a, int b); 和 bool max_num(int a, int b); 只有返回值类型不同。这样会导致系统不知道调用哪一个。编译直接报错。
int max_num(int a, int b);
bool max_num(int a, int b);
float max_num(float a, float b);
举例
#include <iostream>
#include <string>
using namespace std;
void get_min_max(int src[], int arr_len, int* max_v = NULL, int* min_v = NULL)
{
if (arr_len < 0 || (!max_v && !min_v)) return;
int var_max = src[0], var_min = src[0];
for (int i = 1; i < arr_len; ++i)
{
if (var_min > src[i]) var_min = src[i];
if (var_max < src[i]) var_max = src[i];
}
if (max_v) *max_v = var_max;
if (min_v) *min_v = var_min;
}
int main()
{
int src[] = { 66, 33, 55, 22, 88, 89, 19 };
int max_v = 0;
get_min_max(src, sizeof(src) / sizeof(int), &max_v); //只获取最大值
cout << "最大值是:" << max_v << endl;
int min_v = 0;
get_min_max(src, sizeof(src) / sizeof(int), NULL, &min_v); //只获取最小值
cout << "最小值是:" << min_v << endl;
system("pause");
return 0;
}
函数默认参数的注意事项:
①、在函数声明的时候指定,如果没有函数的声明则可以放在函数的定义中,但是声明和定义只能选一个;
②、从第一个有默认值的参数开始,后面的所有参数必须都有默认值才行;
③、调用的时候如果要自定义非第一个默认值的参数,那么前面所有的参数都要明确的写上默认值才行;
④、从使用角度来说函数的默认值比重载更方便,从函数内部实现角度来说比函数的重载更复杂。
#include <iostream>
#include <string>
using namespace std;
bool string_upper_diy(char str[], int str_len, bool b_odd_pos = true)
{
//char* pstr = str;
if (str_len < 0)
{
cout << "输入有问题" << endl;
return 0;
}
if (b_odd_pos == true)
{
for (int i = 0; i < str_len; i = i + 2)
{
if (str[i] >= 'a'&& str[i] <= 'z')
{
str[i] = str[i] - 32;
}
}
for (int ii = 1; ii < str_len; ii = ii + 2)
{
if (str[ii] >= 'A'&& str[ii] <= 'Z')
{
str[ii] = str[ii] + 32;
}
}
}
else
{
for (int i = 1; i < str_len; i = i + 2)
{
if (str[i] >= 'a'&& str[i] <= 'z')
{
str[i] = str[i] - 32;
}
}
for (int ii = 0; ii < str_len; ii = ii + 2)
{
if (str[ii] >= 'A'&& str[ii] <= 'Z')
{
str[ii] = str[ii] + 32;
}
}
}
return 0;
}
int main()
{
char str[50] = "asdhjAAAABFD";
string_upper_diy(str, sizeof(str) / sizeof(char), false);
cout << "输出字符串" << str << endl;
system("pause");
return 0;
}