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

2018-10-14 10:49:02来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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;
}

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C++ 基础 引用

下一篇:2018-10-13 21:30:51 conversion of number systems