zoukankan      html  css  js  c++  java
  • C++函数基础知识

    【这里只是记录一些比较容易忽略的知识点。】

    内联函数

    内联函数的出现,解决了两个技术问题。

    1.当函数需要频繁调用,且函数体较短时,调用函数的开销(保存现场与返回地址)比函数本身的价值相比性价比不高。这时使用内联函数,直接把函数体嵌入到相应的代码位置,更有优势。

    2.其实宏定义(#define)也可以解决1中的问题,但是宏定义往往在传递参数时会让人迷惑。不利于代码维护,阅读。内联函数能解决宏定义带来的不确定性。

    内联函数的定义形式

    inline 类型标示符 函数名(参数列表){函数体};

    使用内联函数注意事项

    对于一个函数来说,是否是内联函数,是由编译器决定的。如果我们在函数面前加上inline关键词,只是表示,建议该函数为内联函数。至于最终会不会成为内联函数嵌入到代码中,还是有编译器决定的。至于怎么决定,取决于以下几点。

    1.内联函数不能有循环,和switch语句

    2.内联函数不能是递归函数

    总的来说,内联函数应该是短小简单的函数。对于编译器来说,它就是代码,如果过于复杂反而会造成代码膨胀,与函数的作用相反。PS:若写内联函数时不遵从以上的两点要求,编译仍然可以通过。但是编译器会将其转化为一般函数。

    最后举个内联函数的栗子(仅供参考)

    #include <iostream>
    using namespace std;
    
    
    inline void neilian()
    {
      cout<<"nei lian han shu ";  
    }
    
    int main()
    {
      neilian();
      return 0;  
    }

     重载函数

    编译器区分重载函数,是判断参数个数,以及参数类型进行的。与参数名,返回类型无关。

    另外在调用函数之前,必须先声明函数原型。

    下面是个小李子

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int nihao(int& a);
    	int nihao();
    	nihao(2);
    	nihao();
    	getchar();
    	return 0;
    }
    
    int nihao(int& a)
    {
    	cout<<"这是有参数的你好"<<endl;
    	return 0;
    }
    int nihao()
    {
    	cout<<"这是没有参数的你好"<<endl;
    	return 0;
    }
    

    其实重载函数真正实现的时候,你还是要写出具体的函数实现过程。只是相对于重新创造个新的函数来说,可以不用记住那么多函数名。并且,这样有利于函数接口的统一管理。如果出现了这种情况:现在要一个求绝对值的函数。我们发现,他们的逻辑是一样的,既先判断正负,若为正既输出,若为负取相反数输出。各种类型的数据都要有自己相应类型的函数,这时使用重载可以解决问题,但是有没有更好的解决方法呢?请看下面的函数模板。

    函数模板

    模板的定义方式

    template <typename 标识符>

    函数定义 

    这是个小栗子

    #include <iostream>
    using namespace std;
    
    template <typename T>
    T modu(T a)
    {
      return a<0?-a:a;
    }
    
    int main()
    {
      int a = -2;
      float b = -1.5f;
      cout<<modu(a)<<endl;
      cout<<modu(b)<<endl;
    
      return 0;
    }

     在需要某种函数的时候,编译器将自动根据模板生成该种函数。当然这种自动也可以变成“手动”。

    还是上面小程序来做例子

    //假如是double的时候,我要变成去绝对值之后+1。我就要用到手动具体化了
    temlpate <>
    double modu(double a)
    {
      return (a<0?-a:a)+1.0;
    }
    //当使用double型数据时,将自动屏蔽之前的模板,而使用这个定义。其他数据类型则不变

    PS:函数的重载与函数模板都是编译时多态的体现。

  • 相关阅读:
    集成信鸽推送!!!
    URI跳转方式地图导航的代码实践
    CocoaPods 的详细使用教程
    学习如何学习
    代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
    宏!!!!(拷贝别人的博客的只为了收藏)
    不修改Xcode项目加载Reveal
    关于开发中的常用手段(个人建议)
    ios高级-属性中Copy的使用
    iOS高级-RunLooper
  • 原文地址:https://www.cnblogs.com/CAION/p/2829931.html
Copyright © 2011-2022 走看看