0x00 默认参数
C++中的默认参数可以实现在函数调用时省略实参,自动提供一个值。
默认参数只能从右到左靠右定义,默认参数之间不能间断必须连续 如果函数有声明和实现,声明和实现不能同时定义缺省参数,默认参数应当放在声明中。
float Area(float r = 2, float pi = 3.14);
float Area(float r, float pi)
{
return r * r * pi;
}
0x01 函数重载
C++中的函数重载实现同一个作用域调用不同功能的同名函数。
1.函数重载条件
1.作用域相同 2.参数不同(参数类型 参数数量 参数顺序) 3.返回值类型不作为重载依据
此外:
5.const type& 与 type & 构成重载 6.const type* 与 type* 构成重载 7.[const type& 与 type] 、[type& 与 type]的函数调用二义性。
参考 C++中的引用作为参数与二义性问题
2.函数重载demo
代码如下(示例):
int Add(int& n1)
{
return n1 + 1;
}
int Add(const int& n1)
{
return n1 + 1;
}
int Add(int* n1)
{
return *n1 + 1;
}
int Add(const int* n1)
{
return *n1 + 1;
}
int main(int argc, char* argv[])
{
int n1 = 10;
int n2 = 100;
int* p1 = &n1;
const int* p2 = &n2;
cout << Add(1) << endl;
cout << Add(n1) << endl;
cout << Add(&n1) << endl;
cout << Add(p1) << endl;
cout << Add(p2) << endl;
return 0;
}
3.函数重载本质
C++使用名称粉碎实现函数重载,就是将函数名再加工一次,只要编译器自己能够识别就足够了。下面我们从obj文件中找粉碎以后的名称,以及根据粉碎以后的函数名找到对应的函数原型。
依旧是上面的代码,使用 010 Editor 打开编译以后的obj文件。查找函数名Add: 发现4个名称刚好在一块:
?Add@@YAHAAH@Z ?Add@@YAHABH@Z ?Add@@YAHPAH@Z ?Add@@YAHPBH@Z
利用 Developer Command Prompt for VS 2019 工具加上 undname 命令可以查看粉碎的名称对应的函数原型: 使用 undname 命令解析上面4个函数名
粉碎以后的名称 | 对应的函数原型 |
---|
?Add@@YAHAAH@Z | int __cdecl Add(int &) | ?Add@@YAHABH@Z | int __cdecl Add(int const &) | ?Add@@YAHPAH@Z | int __cdecl Add(int *) | ?Add@@YAHPBH@Z | int __cdecl Add(int const *) |
C++为了实现函数重载,引入了名称粉碎机制,导致函数名变得面目全非。
|