函数重载
C++允许在同一作用域类声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能
函数重载必须是参数的个数或者类型不同,与返回值无关。
在C语言当中是不支持函数重载的,在c语言编译的时候是完全根据函数名进行编译的,而c++当中,函数进行重命名的时候,会给与C的重命名不一样,会加上参数的内容。
也就是调用的时候,会根据不通过的参数,找寻不同的地址,进入不同的函数。
例如:
#include<iostream>
#include<cstdlib>
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b+1;
}
int main()
{
std::cout<<add(4 , 5)<<std::endl;
std::cout<<add(4.0, 5.0)<<std::endl;
system("pause");
return 0;
}
上述程序就是一个很好的例子,add函数进行了函数重载。
为什么需要函数重载(why)?
试想如果没有函数重载机制,如在C中,你必须要这样去做:为这个print函数取不同的名字,如print_int、print_string。这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型、char*、各种类型的数组等等。这样做很不友好!
类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!
操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,如+可用于连接字符串等!
缺省参数
对于c++来说,还引入了缺省参数这样一个概念。
缺省参数:就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。
例如:
```
#include<iostream>
#include<cstdlib>
int add(int a = 2, int b = 3)
{
return a + b;
}
int main()
{
std::cout << add() << std::endl;
system("pause");
return 0;
}
上述这个过程是一个全缺省,还有一种半缺省。
#include<iostream>
#include<cstdlib>
using namespace std;
int add(int a , int b = 3)
{
return a + b;
}
int main()
{
std::cout << add(8,2) << std::endl;
system("pause");
return 0;
}
缺省参数注意事项:
函数的处理顺序是从右往左。所以对于缺省参数来说,他的缺省顺序也应该是从右向左
,把缺省的放到右边,不缺省的放到最左边。缺省参数中间不能穿插不缺省的参数。
函数指针没有默认参数,函数指针必须全部输入数据,而且函数指针需要精确调用,函数重载和函数缺省参数容易发生冲突。