栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

默认参数与函数重载

0x00 默认参数0x01 函数重载

1.函数重载条件2.函数重载demo3.函数重载本质


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:

发现4个名称刚好在一块:

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

利用 Developer Command prompt for VS 2019 工具加上 undname 命令可以查看粉碎的名称对应的函数原型:

使用 undname 命令解析上面4个函数名

粉碎以后的名称对应的函数原型
?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++为了实现函数重载,引入了名称粉碎机制,导致函数名变得面目全非。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号