C++的函数重载(overload)

什么是函数重载

在这里插入图片描述

Long i=10 隐式地把int类型的10转化成long类型
Long i=(int)10 显示转换
只能小的转大的,大的类型不能转化为小的类型
在这里插入图片描述
在这里插入图片描述

出现的原因——namemangling技术改变了函数名

在这里插入图片描述
利用反汇编查看区别
在这里插入图片描述
机器码这里16进制表示,2个16进制代表一个字节;内存是连续的;机器码存储在exe文件中,载入内存才会有内存地址;
如display方法占用了五个字节,call是调用的意思,调用的display(013c1429h)里的是函数的内存地址
在这里插入图片描述

默认参数

◼ C++允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下:

默认参数只能按照右到左的顺序

在这里插入图片描述
要么左右参数都有默认值,否则一个的话只能从右边先开始赋默认值
在这里插入图片描述

如果函数同时有声明、实现,默认参数只能放在函数声明中

在这里插入图片描述

默认参数的值可以是常量、全局符号(全局变量、函数名)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

默认参数的本质

#include <iostream>
using namespace std;
int sum(int v1, int v2) {
	return v1 + v2;
}
int main() {
	sum(1, 2);
	sum(3, 4);

	return 0;
}

这是在x64下调试的
在VS中调试后ctrl+f11,调出反汇编界面
sum(1, 2);
00007FF6A8AB186A mov edx,2
00007FF6A8AB186F mov ecx,1
00007FF6A8AB1874 call sum (07FF6A8AB1055h)
sum(3, 4);
00007FF6A8AB1879 mov edx,4
00007FF6A8AB187E mov ecx,3
00007FF6A8AB1883 call sum (07FF6A8AB1055h)
这是在x86下调试的
sum(1,2);
013E1EC8 push 2 //先将最右边的push
013E1ECA push 1
013E1ECC call sum (013E1082h)
013E1ED1 add esp,8
sum(3, 4);
013E1ED4 push 4
sum(3, 4);
013E1ED6 push 3
013E1ED8 call sum (013E1082h)
013E1EDD add esp,8
有默认参数时,v2=2,sum(1)与sum(1,2)的比较
在这里插入图片描述
除去内存地址,只有红色方框处不同
在这里插入图片描述

extern “C”

被extern "C"修饰的代码会按照C语言的方式去编译代码
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章