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

来源:互联网 发布:mac怎么打罗马字母 编辑:程序博客网 时间:2024/05/29 04:01
<文章原创,转载请说明出处,联系信箱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 0
原创粉丝点击