什么是函数重载?
何时选择函数重载?
当将要定义一组函数,使它们执行一系列的操作,但是它们是应用在不同的参数类型上的。此时我们可以选择重载函数。
代码分析:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<Windows.h>
using namespace std;
void Swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void Swap(char* a, char* b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
void Swap(float* a, float* b)
{
float tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int x = 10;//整型
int y = 20;
cout << x << "," << y << endl;
Swap(&x, &y);//交换函数注意传的是地址
cout <<x<< ","<<y<< endl;
char x1='a';//字符类型
char y1='b';
cout << x1 << "," << y1 << endl;
Swap(&x1,&y1);
cout << x1 << "," << y1 << endl;
float x2 = 4.2;//浮点型
float y2 = 2.4;
cout << x2 << "," << y2 << endl;
Swap(&x2, &y2);
cout << x2 << "," << y2 << endl;
system("pause");
return 0;
}

那么函数重载是如何选择函数的呢?
这里大致分为三步
第一步:确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数。所谓候选函数就是与被调用函数同名的函数。
第二步:选出的候选函数中调出可行函数。可行函数的函数参数个数与调用的函数参数个数相同,要是可行函数的参数多,则多出来的函数参数都要有相关的
缺省值
。然后再根据参数类型的转换规则将被调用的函数
实参
转换成候选函数的实参。
void add(int);//可行
void add(double, double x = 1.0);//可行
void add(int, int);//没有缺省值
void add(double, double);//同上
int main()
{
add(4.2);
return 0;
}
如果依照参数转换规则没有找到可行函数,则该调用就是错误的。
如果看的到.map文件里面,你会发现函数在编译之后发生了重命名
类似于 ?ADD@@YAHHH@Z
其中
?代表开始 ADD是函数名,@@YA代表参数开始 第一个H代表返回值类型int 剩下的代表参数int int.
@Z代表结束
简而言之,判断一组同名函数能否构成重载,要看能不能通过修改形参来影响实参的值,如果两个函数实参的值都能被修改或都不能被修改,则不能构成重载;否则构成重载。
缺省参数:
缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值
举个代码:
#include <iostream>
#include<Windows.h>
using namespace std;
void func(int a, int b = 3, int c = 1)//三个参数,后两个缺省
{
cout << a << "," << b << "," << c << endl;
}
int main()
{
func(10);
func(10, 20);
func(10, 20, 30);
system("pause");
return 0;
}

看上面相信大家应该清楚缺省的调用了吧。
需要注意的几点:
1.缺省值必须为常量,也可以是全局变量
2.缺省参数只能同时在函数声明与函数定义的一方
3.只能从最后一个参数开始进行省略,就是说,你要省略一个参数,就必须把从它开始到后面的参数都要缺省。
4
.如果函数传参,则调用参数;没传则调用缺省值