函数重载(overload) 默认参数

函数重载

规则

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

注意

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

本质

  • 采用了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指令位置有关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值