每天学习一点C++之三——函数的默认参数

<文章原创,转载请说明出处,联系信箱623730587@qq.com>

一、编程学习在于坚持,其实任何行业亦是如此,每天学习一点点,日久比见功效,就像我经常读的一本电子杂志,
       我每天大概读4篇左右的文章,三年以来从未间断,遇到好的文章,我便收藏先来,近期查看收藏目录,竟然多达
       三百多篇文章,着实让我大吃一惊。今天先说一下我的近期学习计划,希望我能一直坚持下去,在此贴出学习计
       划,希望共勉。
        1 每天复习一点c++基础知识,利用15天的时间完成对标准c++的复习。
        2 利用15天的时候完成对数据结构和算法,STL&模板的复习。
        3 利用40天的时间完成对vc和uc的复习。
        4 在此之后就开始写一些比较小型的项目,游戏等等,此段计划以后在此详细列出。

二、拉牛套车,言归正传,开始今天的内容,c++中函数的默认参数(c语言中没有默认参数的概念)。
      1 概念:一个函数在定义或者声明时,可以给参数提供默认值,在调用这个函数的时候,如果不给这个参数传实参,
         则使用默认的参数值,如果传入参数值,则使用传入的值代替掉默认的值。
      2 作用:减少函数的个数,方便调用。
      3 限制:1)参数的默认值必须靠右,何为靠右?若一个参数有默认值,则该参数的右边所有参数都必须有默认值。
                    2)如果函数的声明和实现文件分开时,必须在函数的声明时指定参数的默认值。这一点非常重要哦。特别
                    是在实际开发中。
       4 这里说明一个小的知识点。与本节内容无关,临时想到的。假设有如下打印数组的函数。
         void printArr(int *data,int size);
         也可以写成这样
         void printArr(int data[],int size);
         当我们把数组传进一个函数时,对它求sizeof(data),得到的结果将是指针本身的大小(4),而非数组的大小
       ,所以如果我们要在函数中用到数组的大小,必须用参数传进来,也就是上面的函数的第二个参数。
        5 这里给出一个打印数组的函数,注意函数声明和实现时的参数列表的使用。
   #include<iostream>
   using namespace std;
   void printArr(int *data,int size = 1,char separator = ',');
   int main()
   {
      int data[5] = {1,2,3,4,5};
      printArr(data,5);
      return 0;
    }
   void printArr(int* data,int size,char separator)
   {
      cout << "[";
      for(int i = 0;i < size - 1; i++)
      {
        cout << data[i] << separator;
      }
      cout << data[size-1] << "]" << endl;
   }

三、内联函数
   1 说内联函数之前,先说说普通函数调用的过程,大家都知道函数的代码是存放在代码区的,现在我在main函数中
      要调用这个函数,这个时候编译器就会开辟一个局部函数栈,将函数的参数进行压栈,一旦这个函数调用完毕,
      这个局部栈就消失,但是我的程序下面又出现了一次该函数的调用,这个时候又得开辟局部函数栈,这样就造成了
      大量的资源浪费。于是内联函数就闪亮登场了。
    2 在编译时,请求编译器把函数的二进制代码直接复制到调用的位置,这样减少了函数的开栈和清理栈的开销,提高
       效率。
    3 内联函数有点像c语言中的宏定义。但是两者又有很大的不同。首先是替换的时期不同,宏是在预编译的时候进行
      替换,而内联函数是在编译阶段时进行;其次是内联函数要进行语法检查,而宏没有,不分青红皂白,直接替换;第
      三,内联只是一种请求,如果请求成功,则按内联方式调用,如果失败,则按普通方式进行调用,宏替换永远成功。
      这有点像寄存器变量的概念(就是在变量前就上register关键字,如果请求成功,则放入寄存器中,如果不成功则按
      普通方式存储)。
    4 只要在普通函数前面加上inline关键字就是内联函数。
    5 若有兴趣,可以使用g++ -S -O2(-O2表示对编译器进行优化,为了提高内联请求成功率)的命令生成汇编文件,看看
       调用的情况,如果前面有call就是按照普通方式调用,如果没有call,则为内联的方式。
    6 讲完这些,有没有感觉内联函数有点像现在的网络流行语“求带走”(扑哧)。

四、c++中的动态内存分配
        new        delete
        new[]      delete[];
       1 new和delete都是操作符,而不是函数。
       2 为什么动态分配的内存必须释放?毕竟在进程运行结束的时候,程序所占的所有资源(内存资源,cpu资源等等
          )都会被操作系统释放,那么问题就来了,既然操作系统能帮我们释放,为什么我们还要画蛇添足呢?这个问题
         曾经让我困扰了一整子,后来才知道,原来还有很多7×24小时的程序,这种程序被设计成不会被结束的,还有一
         些大型程序,在程序结束之前,这种内存资源的浪费就会逐步增加,直到资源耗尽,就像诸葛亮的人生一样。


今天又结束了。结束之际,贴一个小小的笑话。
         问:今天我的心情非常非常不好,为什么?
         答:因为我的想象中有一双滑板鞋!!!!!!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值