cpp——与c之不同——函数

函数

c++函数相较于c函数扩展了三个特性:
  • 匿名参数
  • 默认实参
  • 函数重载

匿名参数

c++支持匿名参数
void eat(int)
{
    cout << "eat(int)" << endl;
}

void attack(int = 8)
{
    cout << "attack(int)" << endl;
}

默认实参

默认实参用于编译期缺失实参替换
默认实参规则:
  • 默认实参可以是任何类型符合(表达式类型与形参类型兼容)的表达式,不一定是常量
  • 可以为一个或多个形参指定默认实参,如果一个形参具有默认实参,那么它后面所有形参(如果还有)都必须有默认实参
  • 同一源文件中每个形参至多只有一个函数声明指定默认实参
  • 不同源文件中默认实参值可以不同
void eat(int food1 = 5, int food2 = 8)
{
    cout << "eat food " << food1 << " and " << food2 << endl;
}

void attack(int hurt = 3 + 5)
{
    cout << "attack hurt " << hurt << endl;
}

函数重载

函数定义&调用
函数定义
void eat(int food1, int food2)
{
    //...
    //...
}
函数调用
eat(5, 8);
经过c编译器编译后的汇编代码为:
函数定义
_sub_eat_:
           //...
           //...
           ret
函数调用
call _sub_eat_
c不支持函数重载,所以函数名全局唯一,用函数名来生成子过程名没有问题
c++支持函数重载,不能再利用函数名来生成子过程名了,否则生成的子过程名重复了,call指令不知道跳转到那一段汇编代码继续执行,c++的函数重载利用函数名+形参列表唯一确定函数,因此生成的子过程名也必须利用函数名+形参列表来生成
经过c++编译器编译后的汇编代码为:
函数定义
_sub_eat_int_int_:
           //...
           //...
           ret
函数调用
call _sub_eat_int_int_
函数指针
c不支持函数重载,通过函数名就可以找到函数入口地址,因此c函数指针不对形参类型做严格检查,形参类型可以为空或者完全精确match,形参类型为空时,通过函数指针调用时对实参不做任何检查,runtime时才能发现错误,形参类型不为空时,通过函数指针调用时会对实参做严格检查,但是函数返回值一定要完全match
void eat(int food1, int food2)
{
    //...
    //...
    printf("eat %d %d\n", food1, food2);
}

void fun_pointer()
{
    void (*pEat1)() = eat;
    void (*pEat2)(int, int) = eat;
    
    pEat1(5);
    pEat1(5, 8);
    pEat1(5, 8, 58);
    
    //pEat2(5);
    pEat2(5, 8);
    //pEat2(5, 8, 58);
}
c++支持函数重载,因此c++的函数指针必须指定函数形参,这样才能找到重载函数集合中的准确函数入口地址
void eat(int food1, int food2)
{
    //...
    //...
    printf("eat %d %d\n", food1, food2);
}

void fun_pointer()
{
    void (*pEat)(int ,int) = eat;
    
    pEat(5, 8);
    //pEat(5);
    //pEat(5, 8, 58);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值