zoukankan      html  css  js  c++  java
  • C++ 函数的扩展①

    //函数扩展--内联函数 inline
    #include<iostream>
    using namespace std;
    
    /*
    c++中const常量可以替代宏常数定义 如:
    const int A = 3;  近似于  #define A 3
    但是 const无法替代宏代码片段
    c++中推荐使用内联函数替代宏代码片段
    c++中使用inline关键字声明内联函数
    内联函数声明时inline关键字必须和函数定义结合在一起,否则c++编译器会忽略内联请求
    
    c++编译器可以将一个函数进行内联编译
    被c++编译器内联编译的函数叫做内联函数
    内联函数在最终生成的代码中是没有定义的
    c++编译器会直接将函数体插入到函数调用的地方(跟宏替换有点相似)
    内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
    
    
    内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)
    内联函数是对c++编译器的一种请求,因此c++编译器可能拒绝这种请求
    内联函数由c++编译器处理,直接将编译后的函数体插入调用的地方
    宏代码片段由预处理器处理,进行简单的文本替换,没有编译过程
    
    现在c++编译能够进行编译优化,因此一些函数计时没有inline声明,也可能被编译器内联编译
    
    c++中的内联编译限制(c++编译器有可能拒绝这种内联请求)
    ①不能存在任何形式的循环语句
    ②不能存在过多的条件判断语句
    ③函数体不能过于庞大
    ④不能对函数进行取地址操作(内联函数在最终生成的代码中是没有定义的,c++编译器会直接将函数体插入到函数调用的地方)
    ⑤函数内联声明必须在调用语句之前
    
    
    c++编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时的压栈,跳转和返回的开销
    因此,当函数的执行开销远大于压栈,跳转,返回所用的开销是,那么内联函数将毫无意义,所以内联函数适用于简单的函数
    
    结论:
    内联函数在编译时直接将函数体插入函数调用的地方
    inline只是一种请求,c++编译器不一定允许这种请求
    内联函数省去了普通函数调用时的压栈,跳转和返回的开销
    */
    
    inline int PrintA(int a, int b);
    
    inline int PrintA(int a, int b){
        return a < b ? a : b;
    }
    
    #define Func(a,b) (a)<(b)?(b):(a)
    
    void main(){
        int a1 = 1, b1 = 2, c1 = 0;
        //内联函数
        c1 = PrintA(++a1, b1);
        //相当于
        /*{
        return a1 < b1 ? a1 : b1;
        }*/
        printf("a1=%d
    ", a1);//打印2
        //宏定义的副作用
        int a2 = 1, b2 = 2, c2 = 0;
        c2 = Func(++a2, b2);//相当于  (++a2)>(b2)?(++a2):(b2)
        printf("a2=%d
    ", a2);//打印3
    
        system("pause");
    }
    //函数扩展--默认参数 
    #include<iostream>
    using namespace std;
    
    //默认参数的规则:
    //只有参数列表后面部分的参数才可以提供默认参数
    //一旦一个函数中使用了默认参数,那么这个参数后面的所有参数都必须使用默认参数值
    //例如:
    /*
    void PrintT(int a=3, int b){
        printf("a=%d;b=%d
    ", a, b);
    }
    */
    //报错  error C2548: “PrintT”: 缺少参数 2 的默认参数
    
    //函数的默认参数
    void PrintA(int a, int b=3){
        printf("a=%d;b=%d
    ",a,b);
    }
    
    void main(){
        PrintA(1, 2);//打印  a=1;b=2
        PrintA(1);//打印  a=1;b=3
        system("pause");
    }
    //函数扩展--函数占位符 (了解)
    #include<iostream>
    using namespace std;
    
    /*
    函数占位符
    占位参数只有参数类型声明,而没有参数名声明
    一般情况下,在函数体内部无法使用占位参数
    所以根本没有实际用处
    一般的应用场景就是操作符重载里表示后置操作符
    */ int Fuc(int a, int b, int){ return a + b; } void main(){ //Fuc(1, 2); //报错 error C2660: “Fuc”: 函数不接受 2 个参数 //说明:函数占位符虽然没有实际作用,但是还必须传一个参数 int c = 0; c=Fuc(1, 2,3); printf("c=%d ", c); system("pause"); }
  • 相关阅读:
    Cookie的定义和分类,及优缺点
    网页开发和设计
    电视精灵(新手练习项目)
    C#体检套餐项目
    C#简单的对象交互
    那些年我们学过的构造函数(构造方法,C#)
    员工打卡课后小项目
    SpringMVC类型转换器
    SpringMVC 异常处理3种方案
    SSH整合(一)hibernate+spring
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5587735.html
Copyright © 2011-2022 走看看