C++函数进阶

内联函数

  • 内联函数 使用关键字inline定义

  • 对于规模较小,调用频繁的函数 ,可以将其声明为内联函数,提高程序执行效率

  • 内联函数是在编译时将被调函数嵌入每一个函数调用处,节省了参数传递、控制转移等开销

  • 内联函数的语法为

  • inline 类型说明符 函数名(参数及类型表)

  • 在定义内联函数时,通常时省去函数的声明,而是在声明位置直接给出函数的定义

#include <iostream>
using namespace std;
​
inline int add(int a, int b)        // 内联函数
{
    return a + b;
}
int main()
{
    int a,b,c;
    a = 10;
    b = 20;
    c = add(a,b);
    cout << "a" << "+" << "b" << "=" << c << endl;
    return 0;
}
​

内联函数在运行时,与普通函数的结果一样,但是在编译时将add函数嵌入相应位置,减少了运行时的函数调用,但内联函数的使用也会使编译后的可执行程序变大

  • 一般只有简单的函数才能成为内联函数

  • 如果函数比较复杂,如含有循环,分支等结构,即使声明为内联函数,编译器也会将其当成普通函数对待。

函数重载

  • 在C语言中因为系统是通过名字来区分各个函数的,所以不能有两个函数具有相同的名字。

  • 在C++中可以定义多个同名函数,只要他们的形参个数或类型不完全一样就可以,编译程序根据实参与形参的类型及个数自动确定调用哪个同名函数,这就是函数重载

int max(int x,int y);
double max(double x, double y);
int main()
{
    int a = 2;
    int b = 3;
    double c = 6.0;
    double e = 4.0;
    int x = max(a,b);
    double y = max(c,e);
    cout << a << "和" << b << "的最大值是" << x << endl;
    cout << c << "和" << e << "的最大值是" << y << endl;
​
    return 0;
}
int max(int x, int y)
{
    if (x >= y)
        return x;
    else
        return y;
}
double max(double x,double y)
{
    if (x >= y)
        return x;
    else
        return y;
}
​

注意,在函数重载中,要避免二义性。

// 在上面的程序中不能出现以下有歧义的代码
int x = 1;
double y = 3.5;
max(x,y);  // 此代码就有二义性,要避免这种情况

image-20230810091604896

函数默认值

在C++中可以为函数参数指定默认参数,若参数不够,用函数的默认参数来补足缺少的实参

double pow(int n=2,int x=1);
int main()
{
    int a = 2;
    int b = 4;
    cout << pow(a,b) << endl;
    cout << pow(b) << endl;
    cout << pow() << endl;
​
    return 0;
}
double pow(int n,int x)
{
    int sum = 1;
    for (int i = 0; i < x; i++) {
        sum *= n;
    }
    return sum;
}

函数默认值的二义性

// 在函数重载时会出现二义性的问题
int add(int x,int y);
double add(int x,double y);
int main()
{
    int a = 10;
    int b = 20;
    double c = 30;
    int x = add(a,b);
    double y = add(a,c);
    // cout << add(a) << endl;      !!二义性!!
    cout << x << endl;
    cout << y << endl;
    return 0;
}
int add(int x,int y)
{
    return x+y;
}
double add(int x,double y)
{
    return x+y;
}

函数指针

专门用于保存函数地址的指针变量,然后使用这个指针变量调用函数,这种指针变量称为函数指针变量,简称函数之指针

// 函数类型 (*函数指针名)(参数类型表);

函数指针的应用

int add(int x,int y);
int sub(int x,int y);
int mul(int x,int y);
int Division(int x,int y);
int main()
{
    int n ;
    int (*p[4])(int x,int y);
    p[0] = add;
    p[1] = sub;
    p[2] = mul;
    p[3] = Division;
    for (int i = 0; i < 4; i++) {
        cout << p[i](10,5) << endl;  // 使用函数指针调用函数
    }
    return 0;
}
int add(int x,int y)
{
    return x+y;
}
int sub(int x,int y)
{
    return x-y;
}
int mul(int x,int y)
{
    return x*y;
}int Division(int x,int y)
{
    if(y == 0)
        return 0;
    else
        return x+y;
}

命令行参数

C++主函数 main也可以带有参数,称为命令行参数,通过改参数可以在命令提示符下运行程序时为程序提供参数

int main(int argc,char *argv[])
    
    // 第一个参数板寸命令行的参数个数,是整型数据,由于程序名本身也被当做一个参数,因此它至少为1
    // 第二个参数argv是指向字符的指针数组,用来接收实参(字符串)。argv[0]就是程序名,argv[1]就是第一个参数

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    int a1, a2, a3;
    char c;
    if (argc != 4)
    {
        cout << "参数数量不对。\n";
        exit(0);
    }
    a1 = atoi(argv[1]);
    a2 = atoi(argv[3]);
    c = argv[2][0];
    switch (c) {
    case '+':
        a3 = a1 + a2;
        break;
    case '-':
        a3 = a1 - a2;
        break;
    case '*':
        a3 = a1 * a2;
        break;
    case '/':
        a3 = a1 / a2;
        break;
    default:
        exit(0);
    }
    cout << a1 << "\t" << a3 << endl;
    getchar();
    return 0;
}

下图是利用cmd运行后缀为exe的可执行文件并且填入参数得到运行结果

image-20230810235002575

image-20230810235418232

变量的存储

1.内部变量(局部变量)

函数内部定义的变量是局部变量,它只在该函数范围内有效。在函数外不能使用这些变量

2.外部变量(全局变量)

全局变量不属于任何一个函数,其作用域是从全局变量定义开始的,到本文件结束为止。全局变量可被作用域内的所有函数直接引用。

变量的存储类别

1.静态变量

static 数据类型 变量名;

如果变量被定义为静态的,则在执行的过程中,变量始终存在,但在其他函数中不能引用他们。也就是说,内部静态变量的作用域仍然是在定义该变量的函数中。

  • 如果对静态变量不初始化,则自动初始化为0(整型或实型)或 '\0' (字符型)。

  • 每次调用他们所在函数时,不再重新赋值,保留上次调用结束时的值

int Factorial(int n);
int main()
{
    int a = 4;
    for (int i = 1; i <= a; ++i) {
        cout << i << "! = " << Factorial(i) <<endl;
    }
    /* 次数  static int f的值
     * 1        1*1
     * 2        1*2
     * 3        2*3
     * 4        2*3*4
     * */
    return 0;
}
int Factorial(int n)
{
    static int f = 1;   // 静态变量,初始化为1,调用时不再重新初始化
    f*=n;
    return f;           // 离开函数后,静态变量f的值被保存
}

2.自动变量

auto 数据类型 变量名;
  • 如果在定义变量时既不指定static也不指定auto,则默认为自动变量。自动变量属于动态存储方式。

  • 在函数中定义的自动变量只在该函数内有效。

  • 函数被调用时分配内存空间,调用结束就释放

  • 自动变量如果不初始化,其值是不确定的。如果初始化,则赋初值是在调用时进行的,且每调用一次都要重新赋一次初值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值