什么是函数重载
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语言的方式去编译代码
很明显,下面的代码会报错,因为C语言不支持重载