zoukankan      html  css  js  c++  java
  • 【C++第二课】---C到C++的函数升级

    C++中对C语言在函数使用方面做了很大的升级

    一﹑内联函数

    1.C++中推荐使用内联函数来替代宏片段代码

    2.C++中使用关键字inline声明内联函数

    例如:

    inline  int  func(int a, int b)
    {
    	return (a > b)?a:b;
    }
    


    需要注意的地方:

    a.内联函数声明时inline关键字必须和函数体定义的地方结合在一起,否则编译器会忽视内联请求

    b.当然如果在声明的时候对进行一些处理,那么编译器还是可以对函数的进行内联请求的,声明的时候需要加上 __attribute__((always_inline))

    c.内联函数虽然是对代码进行替换,但是是有参数检查的,所以这是在编译阶段进行的,要区别于宏(与编译阶段进行)

    3.内联函数编译的限制

    a.不能存在任何形式的循环语句

    b.不能存在过多的条件判断

    c.函数体不能过于庞大

    d.不能对函数进行取址操作

    e.内联函数的使用之前必须声明

    二﹑函数的默认参数

    1.C++在对函数进行声明的时候可以指定函数参数的默认值,举例如下

    #include <iostream>
    
    using namespace std;
    
    int add(int i = 1,int j = 2);
    
    int main(void)
    {
        int result = 0 ;
        result = add(1,1);
        cout<<"i + j ="<<result<<endl;
        result = add();
        cout<<"i + j ="<<result<<endl;
        return 0;
    }
    
    int add(int i,int j)
    {
        return i+j;
    }
    


    下面的例子是一样的

    #include <iostream>
    
    using namespace std;
    
    int add(int i = 1,int j = 2)
    {
        return i+j;
    }
    
    int main(void)
    {
        int result = 0 ;
        result = add(1,1);
        cout<<"i + j ="<<result<<endl;
        result = add();
        cout<<"i + j ="<<result<<endl;
        return 0;
    }


    注意的地方:

    a.一旦在一个函数调用中开始使用默认参数值,,那么这个参数后的所 那么这个参数后的所
    有参数都必须使用默认参数值

    b.占位参数只有参数类型声明,,而没有参数名声明,占位参数只为功能扩展所用(个人理解)

    三﹑函数的重载

    1.函数重载的特点

    a.用同一个函数名定义不同的函数

    b.当函数名和不同的参数搭配时函数的含义不同

    c.当返回值类型不同的时候,不能看作函数重载(函数返回值不能作为函数重载的依据)

    2.函数指针遇到函数重载会怎样做呢?  看一个实例

    #include <iostream>
    
    using namespace std;
    
    int fun(int a)
    {
        int m = a;
        cout<<"m = "<<m<<endl;
    }
    
    int fun(int a,int b)
    {
        int m = a + b;
        cout<<"m = "<<m<<endl;
    }
    
    int fun(int a,int b,int c)
    {
        int m = a + b +c;
        cout<<"m = "<<m<<endl;
    }
    
    int main(int argc,char* argv[])
    {
        typedef int(*FUN)(int);
        typedef int(*FUN1)(int,int);
        typedef int(*FUN2)(int,int,int);
        FUN p = fun;
        FUN1 p1 = fun;
        FUN2 p2 = fun;
        p(1);  
        p1(1,1);   
        p2(1,1,1);     
        return 0;
    }



    打印的内容如下:

    m = 1
    m = 2
    m = 3
    


    所以可以总结出:

    根据重载规则挑选与函数指针参数列表一致的候选者

    严格匹配候选者的函数类型与函数指针的函数类型

    这是编译器在编译的时候进行的.

    四﹑C和C++的互相调用

    当在进行大项目开发的时候,我们经常能够碰到这样的问题,有些组员使用的C开发的,而有的组员使用的是C++开发的,那么我们如何实现C和C++的互相调用呢?


    虽然C++编译器能够兼容C语言的编译方式,,但但C++编译器
    会优先使用C++的方式进行编译
    利用extern关键字强制让C++编译器对代码进行C方式编译


  • 相关阅读:
    Image Processing and Analysis_8_Edge Detection:Finding Edges and Lines in Images by Canny——1983
    2019年C题 视觉情报信息分析
    Image Processing and Analysis_8_Edge Detection:Theory of Edge Detection ——1980
    Computer Vision_2_Active Shape Models:Active Shape Models-Their Training and Application——1995
    Computer Vision_1_Active Appearance Models:Active Appearance Models——2001
    Computer Vision_1_Active Appearance Models :Active Appearance Models——1998
    这群程序员疯了!他们想成为IT界最会带货的男人
    阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效
    Knative Serverless 之道:如何 0 运维、低成本实现应用托管?
    千呼万唤始出来——DataV私有部署功能
  • 原文地址:https://www.cnblogs.com/james1207/p/3327470.html
Copyright © 2011-2022 走看看