c++函数高级 (笔记)

    技术2022-07-10  151

    1、函数的默认参数 c++中,函数的形参列表中的形参可以有默认值 与无默认参数的函数不同的是,在调用有默认值参数的函数中,可以省略掉有默认值的参数,如果不省略就按照传入的参数进行后续操作。

    例子如下:

    //无默认值参数 int func(int a,int b,int c) { return a + b + c; } /*再调用func时,必须要写类似与func(10,10,10) 这样,不能缺少参数*/ //有默认值参数 int func1(int a,int b = 10,int c = 10) { return a + b + c; } /*此时,在调用func1时,就可以直接写func1(10),这样函数就会使用之前默认的值, 但是如果写func1(10,20,20),那么还是按照传入的参数对形参进行赋值*/

    即函数有默认参数时,如果我们自己传入数据,就用自己的数据,如果没有,那么就用默认值

    注意事项: (1)如果某个位置已经有了默认参数,那么从这个位置往后从左到右的形参都必须有默认值 例如:

    int func1(int a,int b = 10,int c = 10) { return a + b + c; } /*b是第一个有默认值的形参,那么从b开始后面的所有 形参都要有默认值*/

    (2)如果函数声明(函数体)有默认参数,那么函数体(函数声明中)就不能有默认参数,否则会有歧义 例如:

    //声明有默认参数 int func1(int a,int b = 10,int c = 10); int func1(int a,int b,int c) { return a + b + c; } //函数体有默认参数 int func1(int a,int b,int c); int func1(int a,int b = 10,int c = 10) { return a + b + c; } 在声明和函数体中,有且仅有一个可以带有默认参数

    2、函数占位参数 c++ 中函数的形参列表里可以有占位参数,用来做占位,调用函数时必需填补该位置 语法 : 返回值类型 函数名(数据类型){} 示例:

    void func(int a,int)//第二个为占位参数 { cout<<"hhh"<<endl; } //调用时必须把第二个参数补齐,即func(10,10) //占位参数可以有默认参数 void func(int a,int = 10)//第二个为占位参数 { cout<<"hhh"<<endl; } /*这样调用func时可以不进行补位,直接func(10),也可以输入自己的数据,同上面对默认参数的用法*/

    3、函数重载 作用: 函数名可以相同,提高复用性 满足条件: 1、在同一个作用域下 2、函数名称相同 3、函数参数类型不同,或者个数不同或者顺序不同 前两个很好理解,第三个条件的话看如下例子:

    //函数参数个数不同 void func(int a) { cout<<"func(int a)"<<endl; } void func() { cout<<"func()"<<endl; } //函数参数类型不同 void func(double a) { cout<<"func(double a)"<<endl; } //函数参数顺序不同 void func(int a,char b) { cout<<"func(int a,char b)"<<endl; } void func(char a,int b) { cout<<"func(char a,int b)"<<endl; } int main() { func(10); func(); func(3.14); func('c',5); func(5,'c'); return 0; } //注意,函数的返回值不可以作为函数重载的条件

    函数重载的注意事项 1、引用作为函数重载的条件

    void func(int &a) { cout<<"func(int &a)"<<Endl; } void func(const int &a) { cout<<"func(const int &a)"<<Endl; } /*引用和常量引用是满足函数重载的第三个条件,但是如果要调用第二个函数 不能使用func(变量)的形式调用,必须要使用 func(常量)的形式调用,因为,int &a = 常量 语法错误*/

    2、函数重载遇到函数默认参数

    void func(int a,int b = 10) { cout<<"func(int a,int b = 10)"<<Endl; } void func(int a) { cout<<"func(int a)"<<Endl; } /*这样定义是符合语法规则的,但是当调用类似与func(10)时 就会产生二义性,所以应该尽量减少二义性的这种情况*/
    Processed: 0.008, SQL: 9