在传统c语言中,函数名必须是唯一的,程序中不允许出现同名的函数。在c++中是允许出现同名的函数,这种现象称为函数重载。
1. 函数重载基本语法
实现函数重载的条件:
①同一个作用域
②参数个数不同
③参数类型不同
④参数顺序不同
#include<iostream>
using namespace std;
//在传统c语言中,函数名必须是唯一的,程序中不允许出现同名的函数。
//在c++中是允许出现同名的函数,这种现象称为函数重载
void test01() //参数个数不同
{
cout << "无参数的func" << " " << endl;
}
void test01(int a)
{
cout << "有int型参数的func" << " " << a << endl;
}
void test01(int a, int b)
{
cout << "参数个数不同" << " " << a + b << endl;
}
void test01(string b) //参数类型不同
{
cout << "有string类型参数的func" << " " << b << endl;
}
void test01(char a,string b) //参数顺序不同
{
cout << "参数顺序不同" << " " << b + a << endl;
}
void test01(string b,char a)
{
cout << "参数顺序不同" << " " << b + b << endl;
}
int main()
{
test01();
test01(5,36);
test01(8);
test01("string型");
test01("string型",'g');
test01('y',"string型");
}
运行结果:
注意:
(一)返回值不作为函数重载依据,即只能通过函数参数进行区分
namespace B{
void MyFunc(string b, int a){}
//int MyFunc(string b, int a){} //无法重载仅按返回值区分的函数
}
(二)函数重载和默认参数一起使用,需要额外注意二义性问题的产生
void MyFunc(string b){
cout << "b: " << b << endl;
}
//函数重载碰上默认参数
void MyFunc(string b, int a = 10){
cout << "a: " << a << " b:" << b << endl;
}
int main(){
MyFunc("hello"); //这时,两个函数都能匹配调用,产生二义性
return 0;
}
2.引用的重载:const也可以作为重载条件
3.函数重载的原理
编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func(); 编译器可能会将函数名修饰成_func,当编译器碰到void func(int x),编译器可能将函数名修饰为_func_int,当编译器碰到void func(int x,char c),编译器可能会将函数名修饰为_func_int_char,这里使用”可能”这个字眼是因为编译器如何修饰重载的函数名称并没有一个统一的标准,所以不同的编译器可能会产生不同的内部名。