欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++基础 inline 默认参数 函数占位参数 函数重载

程序员文章站 2022-06-27 14:08:20
1. inline内联函数 内联函数用于替换宏, 实例: 其中宏和 ++ 连用有副作用。 有以下注意: (1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块 (2)内联函数在最终生成的代码中没有定义,C++编译器直接将函数体插入函数调用处,所以内联函数没有 ......

1. inline内联函数

内联函数用于替换宏,

实例:

其中宏和 ++ 连用有副作用。

#include "iostream"
using namespace std;
#define myfunc(a, b) ((a) < (b) ? (a) : (b))  

inline int myfunc(int a, int b) 
{
    return a < b ? a : b;
}

int main()
{
    int a = 1;
    int b = 3;
    //int c = myfunc(++a, b);  
    int c = myfunc(++a, b);  

    printf("a = %d\n", a); 
    printf("b = %d\n", b);
    printf("c = %d\n", c);

system("pause");
    return 0;
}

 

有以下注意:

(1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块

(2)内联函数在最终生成的代码中没有定义,c++编译器直接将函数体插入函数调用处,所以内联函数没有普通函数调用时的额外开销(压栈,跳转,返回),也不能取地址。

(3)内联函数由编译器处理,直接将编译后的函数体插入调用的地方,宏由预处理器处理,进行简单文本替换,没有任何编译过程。

(4)内联编译的限制:

   不能存在循环语句,不能有太多判断语句,函数体不能过于庞大,不能对函数体取地址,内联声明必须在调用语句之前。

2. 默认参数

如下:

void printab(int x = 3)
{
    printf("x:%d\n", x);
}

规则:

(1)只有参数列表后面部分才可以使用默认参数。

(2)一旦在函数中使用默认参数,这个参数之后的参数都必须使用默认参数。

//在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数
void printabc(int a, int b, int x = 3, int y=4, int z = 5)
{
    printf("x:%d\n", x);
}
int main62(int argc, char *argv[])
{
    printab(2);
    printab();
    system("pause");
    return 0;
}

3. 函数占位参数

如下:

int func(int a, int b, int ) 
{
    return a + b;
}

int main01()
{
    //func(1, 2); //可以吗?
    printf("func(1, 2, 3) = %d\n", func(1, 2, 3));

    getchar();    
    return 0;
}

函数占位参数:

(1)占位参数只有参数类型声明,而没有参数名声明

(2)一般情况下,在函数体内部无法使用占位参数。

 

函数占位参数与默认参数结合

int func2(int a, int b, int = 0)
{
    return a + b;
}
void main()
{
    //如果默认参数和占位参数在一起,都能调用起来
    func2(1, 2);
    func2(1, 2, 3);
    system("pause");
}

 4. 函数重载

(1)函数重载的概念

   当函数名或函数参数不同时,函数的含义不同。

 (2)函数重载的判断标准

        参数类型,个数、顺序

        返回值不是判断标准。

(3)编译器调用函数重载的准则

    将所有同名函数作为候选者

    进行精准匹配实参,和默认参数匹配实参

    如果失败,进行默认类型转换匹配实参。

    如果失败,就失败。

     匹配不能出现二义性。

(4)函数重载与函数默认参数

//当函数默认参数遇上函数重载会发生什么

int func(int a, int b, int c = 0)
{
    return a * b * c;
}

int func(int a, int b)
{
    return a + b;
}

//1个参数的允许吗
int func(int a)
{
    return a + b;
}


int main()
{
    int c = 0;

    c = func(1, 2); // 存在二义性,调用失败,编译不能通过 

    printf("c = %d\n", c);

    printf("press enter to continue ...");
    getchar();    
    return 0;
}

5. 函数重载和函数指针

/*
函数重载与函数指针
    当使用重载函数名对函数指针进行赋值时
    根据重载规则挑选与函数指针参数列表一致的候选者
    严格匹配候选者的函数类型与函数指针的函数类型
*/

int func(int x) // int(int a)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}

typedef int(*pfunc)(int a); // int(int a)

int main()
{
    int c = 0;
    pfunc p = func;

    c = p(1);

    printf("c = %d\n", c);

    printf("press enter to continue ...");
    getchar();    
    return 0;
}