C++默认参数与函数重载


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

代码如下(示例):

// Add(n)与int Add(int& n1)二义性          
// Add(n)与int Add(const int& n1)二义性 
// int Add(int n1)
// {
//     return n1 + 1;
// }

int Add(int& n1)
{
    return n1 + 1;
}

// const引用可以重载引用
int Add(const int& n1)
{
    return n1 + 1;
}

int Add(int* n1)
{
    return *n1 + 1;
}

// const int*可以重载int*
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;    // int Add(const int& n1)

    cout << Add(n1) << endl;   // int Add(int& n1) ||  int Add(const int& n1)

    cout << Add(&n1) << endl;  // int Add(int* n1)
    cout << Add(p1) << endl;   // int Add(int* n1)

    cout << Add(p2) << endl;   // int Add(const int* n1)

    return 0;
}

3.函数重载本质

C++使用名称粉碎实现函数重载,就是将函数名再加工一次,只要编译器自己能够识别就足够了。下面我们从obj文件中找粉碎以后的名称,以及根据粉碎以后的函数名找到对应的函数原型。

依旧是上面的代码,使用 010 Editor 打开编译以后的obj文件。查找函数名Add:
查找Add
发现4个名称刚好在一块:

?Add@@YAHAAH@Z
?Add@@YAHABH@Z
?Add@@YAHPAH@Z
?Add@@YAHPBH@Z

利用 Developer Command Prompt for VS 2019 工具加上 undname 命令可以查看粉碎的名称对应的函数原型:
Developer Command Prompt for VS 2019
使用 undname 命令解析上面4个函数名
undname解析粉碎以后的函数名

粉碎以后的名称对应的函数原型
?Add@@YAHAAH@Zint __cdecl Add(int &)
?Add@@YAHABH@Zint __cdecl Add(int const &)
?Add@@YAHPAH@Zint __cdecl Add(int *)
?Add@@YAHPBH@Zint __cdecl Add(int const *)

C++为了实现函数重载,引入了名称粉碎机制,导致函数名变得面目全非。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shlyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值