一:函数重载基本知识:
1.函数重载的定义:
在相同的作用域内的同名函数.
不同作用域内的同名函数通过作用域来区分不形成重载.
2.函数重载的处理方式:编译器是以静态绑定的方式处理的.
3.函数重载的分类;
类的成员函数的重载和全局函数的重载.
4.在同一个类中的成员函数的重载的特点:
1).作用域相同.(不同作用域不构成重载).
2).函数名相同.
3).参数不相同(个数,顺序或者类型不一致).
4).关键字virtual可有可无.
注意:
1).不能仅以函数返回值类型的不同作为函数重载的依据.
如 int Max(int a,int b) {}
void Max(int a,int b) {}
2).同种类型的参数,其参数名称和使用形式的不同的不能成为重载的依据.
如 int Func(int a) {}
intFunc(int &a) {}
intFunc(const int &a) {}
3).参数的顺序不同也可以形成重载().
如 voidFunc(int a,char c) {}
void Func(char c,int a) {}
4).注意防止参数类型间隐式地转化而导致函数不能重载.
如 void Func(int x,int b) {}
void Func(int a,float b) {}
在调用Func(1,0.5)的时候系统就会出现二义性,因为0.5这种常量在系统中默认是double型的,
然后无法确定转换为int型还是float型.
5.全局函数重载:
在整个作用域范围内的函数重载.
二:函数默认参数和重载二义性:
函数默认参数:
1.函数默认参数的概念:
就是函数声明时给出了具体的默认值参数.
2.函数默认参数存在的必要性:
带来了函数调用上的灵活性,减少了程序设计时重复输入相同参数的繁琐工作.尤其是用于构造函数.
3.函数默认参数的语法格式:
如 void Func(int a,int b = 2, int c = 3) { }
注意:
1.默认参数的声明是从右到左依次默认的,也就是说b有默认值的话,c一定也要有的.
2.对于成员函数的默认参数,只能在声明成员函数时给出,不能在类外实现时给出,否则编译出错.
4.函数默认参数的使用方式:
Func(1); //a=1,默认b=2,c=3
Func(1,2); //a=1,b=2,默认c=3
Func(1,2,3); //a=1,b=2,c=3
重载二义性:
重载函数的二义性问题:
编译器不能确定该调用哪个函数,可以做出多个解释.
重载二义性示例:
void Func() {}
void Func(int a = 1) {}
void Func(int a = 1,int b = 2) {}
void Func(int a = 1,int b = 2, int c = 3) {}
调用时:
//Func();
//Func(1);
//Func(1,2); //有歧义
Func(1,2,3);
如果重载函数中含有隐式类型转换,即使没有默认参数,也可能出现二义性问题,比如:
void Func(int iNum) {}
void Func(float fNum = 0.1) {}
在调用Func(0.5)的时候系统就会出现二义性,因为0.5这种常量在系统中默认是double型的,然后无法确定转换为int型还是float型.