在之前的学习中了解过函数,可以通过函数来实现特定的功能。但是有些时候,很多函数的功能是非常相似,若是给这些函数都起不同的名字在编写和使用的时候就会过于繁杂。因此,C++对此做出了函数重载的概念。
函数重载是在同一范围内允许函数的名字相同,但是这些同名的函数的参数列表不同。参数列表不同既包括参数类型不同,也包括参数的数量不同。如下:
在上面的代码中,存在两个同名函数,这两个函数的返回值类型不同,参数也不同。
在使用的时候,系统会根据用户输入的参数自动匹配最优的一个函数,当用户使用1,2作为参数的时候因为1,2都是int类型的值,所以系统会优先调用int类型参数的add函数。同样,对于1.1的数字,系统会优先调用double类型的参数的add函数
#include <iostream>
int add(int a1, int a2){
int num = 0;
num = a1 + a2;
return num;
}
double add(double a1, double a2){
double num = 0.0;
num = a1 + a2;
return num;
}
int main(){
std::cout << add(1, 2) << std::endl;
std::cout << add(1.1, 1.2) << std::endl;
return 0;
}
但是,此时就会出现疑问。1,2不光可以作为int参数使用,也可以作为double参数使用。如果将用int作为参数类型的add去掉则系统会自动调用double类型的,否则就会优先调用int类型的。
之前介绍过,系统会自动调用最为匹配的参数函数调用,若是没有则会再匹配可以接受的参数使用。正因为这样,在上面的代码中若是不存在double参数类型的add,并且还使用了1.2作为参数,系统不会报错,而是会直接调用int参数类型的函数。此时,就会发生数据泄漏的问题,因此,编写者在编写代码的时候需要对这类问题做全面的考虑,防止出现这种内存丢失的情况。
函数重载不仅仅可以发生在全局中,还可以在类型存在,如下:
#include <iostream>
class Window{
public:
void show(int num){
std::cout << num << std::endl;
}
void show(double num){
std::cout << num << std::endl;
}
};
int main(){
Window win;
win.show(1);
win.show(1.2);
return 0;
}
在类中,依然可以使用函数重载来方便编写代码,依次让代码的使用更为简便。