C++中的内联函数,默认参数和占位参数

说明:里面的示例代码有些被注释掉了,想运行时要去掉注释

#include "iostream"
using namespace std;

/** 
    内联函数出现的原因:
    C++中的const常量可以替代宏常数定义,如:const int A = 3;#define A 3
    C++中推荐使用内联函数替代宏代码片段
    C++中使用inline关键字声明内联函数
    内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
    结论:
    1、内联函数在编译时直接将函数体插入函数调用的地方
    2、inline知识一种请求,编译器不一定允许这种请求
    3、内联函数省去了普通函数调用时压栈,跳转和返回的开销
**/
/**
inline void printA()
{
    int a = 10;
    cout<<"a"<<a<<endl;
}
void main()
{
    printA();
    system("pause");
}
**/
/**
    说明:
    1、必须inline int myfunc(int a,int b)和实现的地方,写在一块。
    2、C++编译器可以将一个函数进行内联编译 被C++编译器内联编译的函数叫做内联函数
       内联函数在最终生成的代码中是没有定义的   C++编译器直接将函数体插入函数调用的地方
       内联函数没有普通函数调用时的额外开销(压栈、跳转、返回)
    3、C++编译器不一定准许函数的内联请求
    4、内联函数时一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)
       内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求
       内联函数有编译器处理,直接将编译后的函数体插入调用的地方
       宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程
    5、现代C++编译器能够进行编译优化、因此一些函数即使没有inline声明,也可能被编译器内联编译
        另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联 如:g++中的 attribute((always inline))属性
    6、C++中内联编译的限制:不能存在任何形式的循环语句   不能存在过多的条件判断语句
        函数体不能过于庞大 不能对函数进行取址操作  函数内联声明必须在调用语句之前
        编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销
        因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义
    结论:
        1、内联函数在编译时直接将函数体插入函数调用的地方
        2、inline只是一种请求,编译器不一定允许这种操作
        3、内联函数省去了普通函数调用时压栈、跳转和返回的开销
**/
//带参数的宏
#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 d = myfunc(++a,b);//测试内联函数时去掉注释
    int c = MYFUNC(++a,b);//==>宏替换并展开 ((++a)<(b)?(++a):(b))
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    printf("c=%d\n",c);
    //printf("d=%d\n",d);

    system("pause");
}
*/
/**============默认餐宿======================**/
/**
    C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
    函数默认参数的规则:
        只有参数列表后面部分的参数才可以提供默认参数值
        一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值
*/
void myPrint(int x  = 3)
{
    cout<<"x"<<x<<endl;
}
void myPrint(int m,int x  = 3,int y = 4)
{
    cout<<"x"<<x<<endl;
}
/**
    函数占位参数
    占位参数只有参数类型声明,而没有参数名声明
    一般情况下,在函数体内部无法使用占位参数
**/
void func1(int a,int b,int)//调用时必须写够参数
{
    cout<<"a:"<<a<<" b:"<<b<<endl;
}
/**
    默认参数和占位参数
    可以将占位参数与默认参数结合起来使用
    意义:
    为以后程序的扩展留下线索   兼容C语言程序中可能出现的不规范写法
    C++可以声明占位参数,占位符参数一般用于程序扩展和对C代码的兼容
**/
int func2(int a,int b,int = 0)
{
    cout<<"a:"<<a<<" b:"<<b<<endl;
    return 0;
}
void main()
{
    //默认参数
    //myPrint(4);
    //myPrint();

    //占位参数
    func1(1,2,3);
    //占位参数和默认参数
    func2(4,5);
    func2(1,2,3);
    system("pause");
    return;
}
 

猜你喜欢

转载自blog.csdn.net/youjiangtengwan1/article/details/83992359