IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++默认参数与函数重载 -> 正文阅读

[C++知识库]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++为了实现函数重载,引入了名称粉碎机制,导致函数名变得面目全非。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:10:05  更:2022-02-28 15:12:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:40:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码