学习记录——day39 C++对函数的扩充 函数重载 函数的默认参数 哑元

一、函数重载(overload)

1、使用原因

        在定义多个函数时,可能会出现,多个函数功能相同, 但参数不同的情况,如:两个整数求和、两个小数求和、三个整数求和...... 由于参数个数或参数类型的不同,就需要定义多个函数名字 ,为避免这种情况,引入了函数重载的概念     

函数重载:函数名“一名多用”,是实现泛型编程的一种。调用时,系统会根据主调函数的实参去自动匹配相应的函数执行

泛型编程:以不变的代码,实现可变的功能

2、重载条件

必须相同的:

        1)函数名相同

        2)形参列表不同

        3)在同一作用域

可以不同的:

        1)返回值可以不同

        2)函数体可以不同

3、示例

#include <iostream>

using namespace std;

int sum(int m ,int n)
{
    return m+n;
}

double sum(double m,double n)
{
    return m+n;
}

float sum(float m,float n)
{
    return m+n;
}

int sum(int m ,int n ,int k)
{
    return m+n+k;
}

int main()
{
    cout<<sum(3,7)<<endl;

    cout<<sum(3.5,7.5)<<endl;

    cout<<sum(3,5,8)<<endl;

    return 0;
}

二、函数的默认参数

        C++允许在定义函数时,给其中的某几个参数设置默认参数,对于设置了默认值的参数,主调函数传数据就使用主调函数传的,主调函数不传数据,就使用默认值

1、默认参数设置原则 从右向左

        由于主调函数向被调函数传递数据时,是从左向右,为呼应主调函数的传递方法,默认参数的设置是从右向左的靠右原则

2、示例

#include <iostream>

using namespace std;

int sum(int m = 0,int n = 0,int k = 0)//设置默认参数
{
    return m+n+k;
}


int main()
{
    
    cout << sum(2,3,5) << endl; //10
    
    cout << sum(2,3) << endl; //5

    cout << sum(2) << endl; //2

    cout << sum() << endl; //0
    
    return 0;
}

3、函数重载相关问题

1)当函数重载和默认参数同时出现时,注意,如果带默认参数的函数包含了重载的函数,那么函数定义时没有问题,但是函数版调用时会不确定调用哪一个

2)如果带默认参数的函数,声明和定义分开时,默认参数写在声明部分,定义部分就不写默认参数了

#include <iostream>


using namespace std;


int sum(int  = 0, int =0, int =100);    //函数声明


//定义重载函数时
//int sum(int x, int y):如果有默认参数包含了该函数,函数定义是没有问题,但是函数调用时会不知道调用哪一个
int sum(int x, double y)
{
    return x+y;
}




int main()
{
    cout << sum(2,3,5) << endl;       //调用了默认参数的函数,三个参数主调函数传递


    cout << sum(2,3) << endl;       //调用了默认参数的函数,前两个参数主调函数传递,后一个参数使用默认的


    cout << sum(2) << endl;       //调用了默认参数的函数,前一个参数主调函数传递,后两个参数使用默认的


    cout << sum() << endl;        //调用了默认参数的函数,三个参数使用的都是默认值


    return 0;
}


//函数定义在被调函数后面
int sum(int m , int n, int k)
{
    return m+n+k;
}

三、哑元

        C++定义函数时,支持哑元,运行某个形参或某几个形参只有声明,没有实际意义,唯一的作用就是起到占位作用

1、方便后期更改函数 

        对于某个多次调用的函数进行参数的修改时,每一处引用到该函数的代码都需要修该,很不方便。对此可以使用哑元,对多余的参数只接收,不使用,避免报错。

 2、软件更新

        当某个程序已经发布后,随着技术的升级,可能会对某些函数进行优化,将原本有多个参数的函数,只需要少了的参数就可以完成,但是此时,未优化前的函数已经被多次调用,修改起来不方便,此时就可以在定义函数时,将被优化掉的形参设置成哑元,只起到接受数据的作用,并不起实际作用

3、自增自减运算符重载时,用于区分前置和后置

四、 内联函数

        C++支持内联函数,使用关键字inline在函数定义前使用

1、作用 提供程序的执行效率

        被设置成内联函数的函数,在编译时,编译器会建议将内联函数自动展开,无需在运行时为该函数开辟内存空间,提高程序的执行效率

2、内联函数的设置相关

        对设置对象的要求

                1)函数体积小:内联函数展开后会一直占用运行空间,体积大的函数比较影响运行效率

                2)调用频繁的函数:对于普通函数,每次调用,系统都会为其分配空间,调用结束回收空间;对于调用频繁的函数,将其设为内联函数可以避免多次调用消耗时间

                3)递归函数不能设为内联函数

        缺点:如果大量使用内联函数,会使得主程序体积膨胀

#include <iostream>


using namespace std;


//该函数中的参数2就是一个哑元,只起到占位作用,不让程序优化后报错
inline int sum(int m, int, int k)
{
    return m+k;
}

int main()
{
    cout << sum(2,3,5) << endl;
    cout << sum(2,3,5) << endl;

    return 0;
}

3、内联函数与带参宏的区别

         在C++中,内联函数和带参宏虽然都可以用来在编译时展开代码以减少函数调用的开销,但它们之间存在几个关键的区别:

1.)类型检查
内联函数:内联函数是真正的函数,支持类型安全,会进行类型检查。
带参宏:宏只是预处理器的文本替换工具,不进行类型检查,容易引发类型相关的错误。
2.)编译器优化
内联函数:内联函数允许编译器进行更多优化,比如常量折叠、死代码消除等。
带参宏:宏展开后的代码通常不会受到这些优化的好处,因为它们在预处理阶段就已经被处理了。
3.)调试
内联函数:在调试时,内联函数可以像普通函数一样进行单步调试。
带参宏:宏在预处理阶段就已经被展开,这使得调试变得困难,因为它们在源代码中不再是独立的实体。
4.)作用域
内联函数:内联函数遵循正常的作用域规则。
带参宏:宏没有作用域的概念,它们可以在定义后的任何地方被展开,有时会导致意外的名字冲突。
5.)重复代码
内联函数:内联函数的代码在多个调用点展开时,编译器可以智能地处理,避免不必要的代码膨胀。
带参宏:宏每次使用时都会文本上的复制粘贴,可能会导致代码膨胀。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值