前情大概:在前面的故事里,小伙伴们帮助野人部落的老酋长解答了部落难题,从解题过程中掌握到了循环结构的原理,学会了while循环和for循环的使用,并成为了野人部落的朋友。
小伙伴们刚走出森林,就被一阵阵轰隆隆的机器声吸引了,大家继续向前没走多久,就看见了一座工厂,轰鸣声似乎就是从这里传出来的。大家走入工厂,看见的是一台台机器臂,流水线式的生产着一些机器怪物,流水线上有的机器臂制作怪物椭圆形的身体;有的机器臂制作树枝形的机器手;有的负责组装;最后一步是在生产出来的怪物身上用激光刻上数字号码。生产出来的怪物在流水线出口处激活电源开关,这些怪物就仿佛突然有了生命似的,机器手伸展开,撑着地走下流水线,然后好像事先知道了自己的工作任务,有的开始搬运杂物,有的开始清理地面,有的则负责把更多的生产原料搬到流水线上。
“就像一只只大蜘蛛!好像制造这些蜘蛛是用来干活的。”
“嗯,是这样的。可是你们知道这些一模一样的蜘蛛,是怎么创造出来的么?”小艾问。
小伙伴们说:“当然是按照机器流水线的指定工序做出来的喽。”
“没错,可是机器也是通过程序来控制的,就像做蛋糕需要模子一样,制作这些机械蜘蛛也需要模子,下面就教你们一个创造机器怪物的技术—函数,”小艾说,“看看下面这段简单的程序,就了解函数是什么了。”
小艾说:“这段程序简单吧,看懂了这段程序也就了解了函数的作用。函数一般的情况下要先定义,再使用(调用),函数的定义格式是这样的:”
“不过函数在使用(调用)前要先定义,这样才能让后面的main函数知道它,比如像前面的这段程序。”小艾接着说:“不过,函数也可以‘前向声明’,就是先声明再调用,把定义放在最后,比如这样:”
函数声明的格式是:
看这个示例:
小伙伴们看了看这段程序说:“现在我们明白了什么是函数啦,可是,使用函数有什么好处呢?”
“问得好!”小艾说,“当我们创建一个机器怪物的时候,程序调用一次createMonster()函数就可以了,如果创建两个、三个呢?仍然只需要反复调用createMonster()函数就行。就像用一个蛋糕模子制作多块蛋糕一样。”
就像这样:
运行结果是创建了3个机器怪物:
“哦,我们明白了!”小伙伴们说。
小艾说:“现在我们给这个函数添加烧写id号的功能,实现类似在机器人身上烧刻号码数字的功能。但是如何向函数中传入号码数字呢?你们猜猜看。”
奥卡说:“是不是利用函数的参数列表啊?前面的程序就没用到这个功能。”
小艾说:“奥卡说的对,就是利用参数列表。那么你们想想看,应该如何在参数列表中定义变量呢?像这样:”
小艾说:“还记得变量怎么定义吗?你们试一下。”
小伙伴们有了前面的知识基础,很快就完成了变量的定义(聪明的你也做完了吗?参考答案7-1)
运行结果如下:
小艾说:“现在你们已经学会了如何向函数内部传递参数,那么函数如何向外传递值呢?比如,我们现在已经有了一个编号id为的机器怪物,现在我们再创造一个怪物,要求是它的编号不能再是,如果创造成功就返回‘创造成功’的信息,否则就返回‘创建失败’的信息。这个怎么实现呢?”
“这个吗…”小伙伴们犯难了。
“如果我们实现了这个功能,我们就可以更新这段程序,使所有的机器怪物的编号id都不重复。”小艾伸出了自己的机器臂,在机器臂的一根手指上有一个脉冲点,闪烁着绿色的光芒。“通过这个脉冲点,我可以把信息传入到生产机器人的设备中,实现功能更新。”
“可是,现在我们完全没有头绪啊?!”小伙伴们无奈的说。
“其实,你们仔细观察一下前面我们讲到的‘函数定义格式’,其中有个‘返回值类型’,现在我们还没有使用过呢!”
小艾说:“利用这个‘返回值’,就可以实现我们想要的功能了。我们只需要判断机器人创建是成功还是失败,所以需要返回值是什么类型呢?你们再想想,把下面的程序补充完整。”(参考答案7-2)
由于得到了小艾的提示,小伙伴们思考了一下就完成了答案。小艾把这段程序通过自己手臂的脉冲输入了怪物制造机,确实解决了id号是编码的重复问题,运行结果如下:
虽然程序离完全避免重复id号的功能实现还有一定的差距,但是却是大家共同努力的结果,小伙伴们都很高兴。
“好啦,下面有一个新的挑战,这个问题有点难度哟,你们敢迎接这个新挑战吗?”
“敢!”小伙伴们异口同声地大声回答。
“好,这个问题是这样的:要创建一个既有id编号,又可以自行决定腿的数量的函数。怎么样,有没有思路?”
小伙伴们又习惯性地聚在一起研究起来:如果只是需要一个id号,那么函数参数列表需要一个参数,如果再加上一个腿的数量,就需要两个参数了。那么这个函数应该写成:
可是现在有两个createMonster函数了,一个是createMonster(intid),一个是createMonster(intid,intlegNum),那么它们应该同时使用呢?还是只保留其中一个呢?
因为有时候只需输入一个id号就可以(这时候生产出来的机器怪物的腿都是4条),而有的时候又需要输入两个参数(id号和腿的数量),所以还是同时使用比较好。但是,这样使用允许吗?小伙伴们用疑惑的眼光询问小艾。
小艾笑了,“同时使用当然是可以的,这在语法上叫做‘函数重载’。比如这样:”(试着把空白处填写完整吧!)
小伙伴们顺利完成了两个同名函数的重载。
小艾高兴地说:“你们干得很不错,函数掌握的很快很好,如果要想进一步实现更多更强大的功能,还需要学习新知识才行。现在不急,保持求知的欲望比什么都重要!”
小伙伴们看着那些刻着新id编号的机器怪物,不断地走下生产流水线,感觉它们也不是那么可怕,反而有些可爱了!
//--------------
(版权所有微博
小小熊爸比,分享或转载前请标明出处!)故事后记:
1)c++函数为什么要进行前向声明?
2)c++函数什么情况下可以不进行前向声明?
3)如果想创建的每一个机器怪物的id号都不重复,你有什么好的办法吗?
4)你掌握了函数重载的概念吗,函数重载还能完成哪些实际的功能,试着想一想?
(参考答案7-1)空白处代码如下: