171027—函数自学【知识点初识二】

来源:互联网 发布:顺丰淘宝买飞机 编辑:程序博客网 时间:2024/05/16 14:13

一.向组织承认错误,昨天被一大堆有的没的的乱七八糟的事缠住周身,委实磨去学习所需的静心,更别提坐下来敲一篇总结(时间都没有。。),只是稍微看了下书。为学习而学习的嫌疑过大。。

二.函数参数的传递:
前言:上回书说得好生不正经。。且有偏颇。看书不看小标题的下场。。
上次总结的很多内容仅仅是很小一部分的特性,而非共性。
对函数的参数而言,分为三种:传值,指针,引用。(又跟变量惊人相似哇)上次觉得很神奇的一些特性仅仅是传值参数的,而且是用来排他的。
指针和引用参数可以在执行函数体时直接对实参进行改动,但也可以通过在定义时定成 const 来防止改变实参的值。

  • const 的含义在这里体现的更为广义,const 约束某量为只读,即不可更改。我还是很容易把它跟现有思维中“常量”的概念搞混。

函数参数的返回类型:基本类型,指针类型(int* func(….)),引用类型(int& func());

三.函数调用机制:大乱斗。。
一个程序是由若干个函数组成的
各函数之间可以互相调用,可以嵌套,可以递归。

之前刚开始学习函数时遇到很多代码都把要用的函数写在最后面,让人很怀疑它怎么能在定义函数之前就使用函数??书上解释了这一机制的运行原理:
系统使用堆栈来储存调用一个函数时调用现场(我觉得这个词及其传神)各种参数,所需返回值的地址(谁来接结果)等等存入堆栈,然后传递参数,让被调用的函数(终于理解这个“被”了)控制局面,执行完成之后,堆栈弹出现场参数,控制权返还调用函数继续执行。

这个机制的作用在进行函数递归调用的时候体现得更完全。

函数可以嵌套使用,即在一个函数中可以调用另外的函数…..无穷无尽写下去。
函数可以调用自己(有没有点走火入魔的感觉?自己唤醒自己。。)即为函数的递归调用。

在递归调用时,堆栈一层层储存各次的条件,直至最底层,而后一层层往上弹结果,一直弹空。一铲铲挖坑,一点点回填。

函数递归机制的思维让我觉得很“简洁”。
在Cpp学习中,很容易发现我们总是在以各种方式去探索描述问题的最本质特性。本质又本质。比如书上说“构成递归函数有两个基本要素:”

  • 描述问题规模逐步缩小的递归算法;//洋葱怎么剥开?
  • 描述基本情况的递归终止条件。 //剥到什么时候算完。
  • (经常跟判断语句放一起,if跟else正好各自解决一个。)

在这里你也可以体味到程序的意义:只要我们找到问题的本质,将解决思路以cpp模块化,剩下的就交给电脑强大的计算能力就好(而这正是我们的最大不足)。以斐波那契数列为例,当年为算它吃过多少苦头。。那些无理高次式。。而用递归的思想,只要一步步往下分解,总会得到只有1和2的时候,这个做法很蠢,但最靠谱。毕竟对电脑来说。计算量已经是优势了,所以很多我们觉得stupid的做法,或许就是写成程序的最好作法。

P.S. 局部对象,非局部对象,静态对象的初步理解:

局部量是非全局的,只在代码中的一段(比如一个自定义的函数里出现)。main函数里定义的变量理论上都是非局部量。(只有main函数是主体)
静态对象是指突然给出来的,比如调用一个函数计算250的函数值:func(250),这个250既不是main函数里定义过的(非局部),也不是func函数里定义过的(局部),是哗啦出来的,用完就完了。