-
-
[分享]C++基础七-函数重载
-
发表于: 2021-8-25 18:35 5506
-
在实际开发中,有时候我们需要实现几个功能类似的函数,只是函数内细节不同,例如求图形面积,可以是圆形、长方形、三角形。在C语言中,往往需要分别设计三个不同名的函数,但是在C++中,允许多个函数拥有相同的函数名,只要函数的参数列表不同就可以,这就是函数重载。借助函数重载,一个函数名可以有多种用途。
参数列表包括参数类型、参数个数、参数顺序,只要有一个不同就是参数列表不同。
编译器在编译.c文件时,只会给函数进行简单的重命名,具体的方法是给函数名之前加上“_”,所以两个函数名相同的函数在编译之后的函数名也相同,调用者会因为不知道到底调用哪个而出错。
编译器在编译.cpp文件中当前使用的作用域里的同名函数时,根据函数形参的类型和顺序会对函数进行重命名,不同的编译器在编译时对函数的重命名标准不一样,但总的来说,他们都把文件中的同一个函数名进行了重命名。
根据返回值类型(不起决定性作用)和形参类型和顺序(起决定性作用)的规则重命名。
根据函数名字的字符数和形参类型和顺序的规则重命名并记录在符号表中,从而产生不同的函数名,当外面的函数被调用时,根据这个记录的结果去寻找符合要求的函数名进行调用。
从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。
在C++中,定义函数时可以给形参指定一个默认值,这样调用函数时如果没有给这个形参赋值,那么就使用这个默认值。
函数形参可全部指定默认值,也可部分指定默认值,部分指定的时候,从右向左连续指定,随意指定会出现重定义的错误。
有默认值的函数形参,可不用传递实参,若给有默认值的函数形参传递了实参,默认值会被覆盖掉。
函数重载的二义性指的是在编译过程中无法找出最匹配的函数,或者说编译器在函数匹配过后还是有多个函数满足要求,无法确定该执行哪一个引发的错误。例如:
double GetArea(double radius)
{
return
radius
*
radius
*
3.14
;
}
double GetArea(
int
length,
int
width)
{
return
length
*
width;
}
double GetArea(double bottom,double height)
{
return
bottom
*
height
/
2
;
}
double GetArea(double radius)
{
return
radius
*
radius
*
3.14
;
}
double GetArea(
int
length,
int
width)
{
return
length
*
width;
}
double GetArea(double bottom,double height)
{
return
bottom
*
height
/
2
;
}
/
/
默认参数应该在声明中提供
void SayHello(const char
*
name, const char
*
text
=
"hello"
);
void SayHello(const char
*
name, const char
*
text)
{
cout << text << name << endl;
}
/
/
默认参数应该在声明中提供
void SayHello(const char
*
name, const char
*
text
=
"hello"
);
void SayHello(const char
*
name, const char
*
text)
{
cout << text << name << endl;
}
#include <iostream>
using namespace std;
int
Add(
int
a,
int
b)
{
return
a
+
b;
}
double Add(double a,double b)
{
return
a
+
b;
}
double Add(double a,double b,double c
=
0
)
{
return
a
+
b
+
c;
}
int
main()
{
int
i
=
9
;
double d
=
9.9
;
Add(i,i);
/
/
Add(d,d);
/
/
函数重载二义性,要注意默认参数
/
/
Add(i,d);
/
/
函数重载二义性,可以在调用时进行类型转换;
Add(i,(
int
)f);
system(
"pause"
);
return
0
;
}
#include <iostream>
using namespace std;
int
Add(
int
a,
int
b)
赞赏
- [分享]C++基础十七-异常机制 8612
- [分享]C++基础十六-模板 8968
- [分享]C++基础十五-运算符重载 8991
- [分享]C++基础十四-抽象类 8703
- [分享]C++基础十三-多态 8505