在学习c++的过程中学到了一些关于函数重载以及函数默认参数的一些知识,因此记录下来,因为笔者是初学者,如果有什么错误请各位大佬斧正!
1.1 什么是函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。同时在参考其他大佬的文章中发现,即使是函数名相同以及函数的参数个数以及类型相同同样可以形成函数重载,只需要对函数进行const/volatiles属性进行限制。
1.2 函数重载的形式
在上文中介绍了c++函数重载的概念,对于函数重载来说以下形式就可以构成函数重载
1.函数参数类型不同:
void test1(int i)
{
cout << "这是int类型的参数" << i << endl;
}
void test1(string str)
{
cout << "这是string类型的参数" << str << endl;
}
2.函数参数个数不同:函数参数个数不同时也可视为重载
void test1(int i,string str)
{
cout << "这是int类型的参数" << i << endl;
}
void test1(string str)
{
cout << "这是string类型的参数" << str << endl;
}
3.函数参数个数以及类型都不相同,代码和上面类型就不再贴出。
4.函数使用const/volatiles属性进行实现函数重载,代码如下
struct test
{
int bar()const
{
return 2;
}
int bar()
{
return 3;
}
};
int main()
{
test a; #实例化test对象a
cout << a.bar() << endl;
const test b; # 实例化拥有const属性的对象b
cout << b.bar() << endl;
getchar();
return 0;
}
输入后发现内容为3,2
通过输出可以发现当对函数进行const限制时同样可以实现函数重载。
1.3 函数重载与默认参数的冲突
当在类中同时使用函数重载以及默认参数时可能导致编译器在匹配函数时发生歧义,最后抛出异常,下面看一个小案例。
void test(string str, int i = 1) {
cout << "有默认参数的函数" << endl;
}
void test(string str, int i) {
cout << "没有默认参数的函数" << endl;
}
int main()
{
test("1111",1);
return 0;
}
上面这段代码无法运行的,因为当test函数在定义时如果指定了默认参数的话,当进行函数重载时就会照成二义性,例如下面调用的test(“1111”,1)。它既可以调用上面的带有默认参数的test函数,同样可以调用下面的test函数,导致程序无法运行,在函数重载以及默认参数同时存在时,如果发生歧义,建议保留默认参数。
总结
本来想通过一些反汇编代码讲函数重载的一些原理进行展示,无奈编译器出了问题,以后有机会在进行展示。小白编程,大佬请多多指正,谢谢!
本文介绍了C++中的函数重载概念,包括相同函数名但参数列表不同的重载方式,以及如何通过const/volatiles属性实现重载。同时讨论了函数重载与默认参数共存时可能引发的编译歧义问题,提醒开发者在遇到这种情况时要注意避免二义性。
267

被折叠的 条评论
为什么被折叠?



