创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
【c语言】全部知识点总结
目录
- 一、概念
- 二、用法
- 有函数参数默认值的函数重载
- 不构成函数重载的例子
- 总结
一、概念
函数重载是指 在同一个作用域下,函数名相同,参数列表不同(类型、数量、顺序),返回值类型无所谓 的函数
重载的函数在调用时,编译器可以根据实参自动去匹配对应的函数
二、用法
根据函数重载的定义,定义一组函数:
他们函数名相同,但是返回值和参数列表都不同
int add(int a, int b)
{return a + b;
}
double add(double a, double b)
{return a + b;
}
这两个函数就构成了函数重载,在主函数中可以直接调用add函数
进行加法计算,编译器会根据参数列表的不同自动匹配不同的函数(根据int型
参数匹配int add函数
,根据double类型
参数匹配double add函数
)
int main()
{cout << add(1, 2) << endl;cout << add(1.1, 1.2) <<endl;return 0;
}
选中第一条add(1, 2)
语句,可以看到匹配了int add
函数
选中第二条add(1.1, 1.2)
语句,就匹配了double add
函数
输出结果:
以下是一些函数重载的例子
void fun(int a)
{cout << __FUNCSIG__ << endl;
}
void fun(char a, int b)
{cout << __FUNCSIG__ << endl;
}
void fun(int a,char b) {cout << __FUNCSIG__ << endl;
}
在学过【C/C++】函数参数默认值 的知识后,我们再来研究一下有函数参数默认值的函数重载:
有函数参数默认值的函数重载
void fun(int a)
{cout << __FUNCSIG__ << endl;
}
void fun(int a,char b) {cout << __FUNCSIG__ << endl;
}//对上面的函数指定一个默认值:
void fun(int a, char b='b')
{cout << __FUNCSIG__ << endl;
}
int main()
{fun(7,x);return 0;
}
如果给void fun函数
中的参数b指定默认值:char b='b'
此时的void fun(int a, char b='b')
函数与void fun(int a,char b)
函数构成函数重载吗?还是与void fun(int a)
函数构成函数重载?
通过运行可以查看到错误为 函数“void fun(int,char)”
已有主体,因此void fun(int a, char b='b')
函数与void fun(int a,char b)
并不构成函数重载,他们的参数列表和返回值都相同!
如果是void fun(int a)
函数与void fun(int a, char b='b')
函数呢?构成重载吗?
初步思考🤔,这两个函数参数列表好像不同,只是这两个函数与调用时的参数列表匹配
void fun(int a)
{cout << __FUNCSIG__ << endl;
}
void fun(int a, char b='b')
{cout << __FUNCSIG__ << endl;
}
int main()
{fun(7);return 0;
}
此时运行查看:错误为C2668 “fun”: 对重载函数的调用不明确
,看来他们构成了函数重载,只是调用不明确,如何对某一个函数明确调用呢?
类比局部变量声明,函数也可以进行局部函数声明!
只需要在主函数中进行局部函数声明,使用{ }
指定在某段代码块中使用该函数
比如,我现在要使用void fun(int a)
函数
void fun(int a)
{cout << __FUNCSIG__ << endl;
}
void fun(int a, char b='b')
{cout << __FUNCSIG__ << endl;
}
int main()
{{//函数局部声明void fun(int a);fun(7); //void __cdecl fun(int)}return 0;
}
如果同时需要在主函数中使用void fun(int a)
和void fun(int a, char b='b')
这两个函数
只需要在不同的位置都进行函数声明,使用{ }
分隔开
void fun(int a)
{cout << __FUNCSIG__ << endl;
}
void fun(int a, char b='b')
{cout << __FUNCSIG__ << endl;
}
int main()
{//.....{//函数局部声明void fun(int a);fun(7); //void __cdecl fun(int)}//.....{//函数局部声明void fun(int a, char b = 'b');fun(7); //void __cdecl fun(int,char)}return 0;
}
这样就在同一个主函数中使用了 在指定函数参数默认值后
导致参数列表相同
的重载函数
不构成函数重载的例子
*p
和p[]
都是地址p,参数列表相同,不构成函数重载
void fun(int* p)
{//...
}
void fun(int p[])
{//...
}
char
与 const char
相同,类型和常量修饰符都相同,认为是相同的函数签名,不构成函数重载
void fun(char a)
{//...
}
void fun(const char a)
{//...
}
(错误原因都是函数已有主体,也就是函数重定义)
在学过函数参数默认值的函数重载后,上面的代码可以改成如下,就构成了函数重载
void fun(const char a, int b = 0)
{//...
}
总结
函数重载是指 在同一个作用域下,函数名相同,参数列表不同(类型、数量、顺序),返回类型可同可不同 的函数
-
重载的函数在调用时,编译器可以根据实参自动去匹配对应的函数
-
对于
指定函数参数默认值后
导致参数列表相同
的重载函数,主函数调用时只需要对要调用的函数进行局部函数声明
-
函数重载可以提高代码的可读性,使得代码更加清晰明了
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |