函数重载
规则
- 函数名相同
- 参数个数、类型、顺序不同
注意
- 返回值类型与函数重载无关
- 调用函数时,实参的隐式类型转换可能会产生二义性。
本质
- 采用了name mangling 或者叫name decoration的技术
- c++编译器会对符号名(函数名)进行改变、修饰
- 不同编译器(MSVC,g++)有不同的生成规则
- 通过ida打开 [vs_release_禁止优化]可以看到
默认参数
规则
- 默认参数只能按照从右到左的顺序
- 函数同时有声明和实现,默认参数只能放到函数声明中
#include <iostream>
using namespace std;
//没有{}
void test(int a,int b=10);
int main()
{
test(1);
return 0;
}
//不用写默认函数
void test(int a, int b) {
cout << "test" << endl;
}
- 默认参数的值可以是常量、全局符号(全局变量、函数名)
#include <iostream>
using namespace std;
void test(int a)
{
cout << "test "<<a<< endl;
}
//这里只能声明指向函数的指针,不能给函数传递参数
void display(int v1, double a, void (*p)(int ) = test);
int main()
{
display(1, 3);
return 0;
}
void display(int v1, double a, void (*p)(int ))
{
cout << v1 << endl;
p(a);
//p 的参数只能通过display的其他参数传入。
}
注意
函数重载、默认参数可能会产生二义性(建议优先使用默认参数,功能更全)
void display(int a,int b=10);
void display(int a);
int main(){
display(1);
}
本质
两者都push 10, 1;
d1,c5 与call指令位置有关