函数重载(overload) 默认参数

函数重载

规则

  • 函数名相同
  • 参数个数、类型、顺序不同

注意

  • 返回值类型与函数重载无关
  • 调用函数时,实参的隐式类型转换可能会产生二义性。

本质

  • 采用了name mangling 或者叫name decoration的技术
  • c++编译器会对符号名(函数名)进行改变、修饰
  • 不同编译器(MSVC,g++)有不同的生成规则
  • 通过ida打开 [vs_release_禁止优化]可以看到

函数重载(overload) 默认参数_第1张图片

默认参数

规则

  • 默认参数只能按照从右到左的顺序
  • 函数同时有声明和实现,默认参数只能放到函数声明中
#include 
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 
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);
}

本质

函数重载(overload) 默认参数_第2张图片
两者都push 10, 1;
d1,c5 与call指令位置有关

你可能感兴趣的:(cpp)