是该到动手写写代码时候了,我们先写个函数。
请使用Code::Blocks的向导,创建一个控制台应用,命名为HelloWorldFn。
打开main.cpp文件,如果您准备在代码用到汉字,请记得将main.cpp的编码设置为“系统默认”。
在本小节中,我们的代码将不断“演变”,首先来看一眼我们比较熟悉的原始版:
001 #include <iostream>
003 using namespace std;
005 int main()
006 {
007 cout << "Hello world!" << endl;
008 return 0;
009
010 }
3.3.1. 定义函数
首先,我们在003和005之间,插入以下代码片段(不包括行号):
005 void Hello()
006 {
007 cout << "Hello!" << endl;
008 }
现在,我们定义了一个名为Hello的函数,其功能是在屏蔽是输出一句话“Hello!”。这个函数结果类型是void,表示不需要返回值,因此在这个函数里我们也没有找到return。
编译、运行这个程序,我们发现输出结果和经典版没有任何区别,屏幕上仍然是打印出“Hello world!”。
〖小提示〗:函数中代码,仅当被调用时,才起作用。
定义函数,但从不调用它,则该函数中的代码不会被执行。这个函数定义对程序执行也就没有什么影响。当编译器准备优化时,它甚至有本事把那闲置不用的函数,从最终程序里剔除。
3.3.2. 调用函数
接着,我们来调用Hello函数。我们在main函数中调用它。请将main函数改写成如下,改变部分是012行。代码片段如下
010 int main()
011 {
012 Hello();
013 return 0;
014 }
现在编译、运行程序,屏幕上输出将是“Hello!”。这行话不是在main中直接输出了,相反,是通过main函数调用Hello函数,然后在后者输出。
3.3.3. 重复调用
这次,我们在012之后,再插入一行Hello(),即连续两次调用Hello()。代码片段如下:
012 Hello();
013 Hello();
编译、运行……这个例子,说出函数的一个重要功能:函数方便代码复用。也就是,如果你发觉有一段代码经常被用到,那你就可以考虑把这段代码封装成函数。
〖轻松一刻〗:何时需要一个函数?
想象某个阳光明媚的清晨,你走进公司的大楼,心情很好,看到同事小A,你微笑点头:“Hello!”;看到小B,你微笑点头:“Hello!”;看到小C,你微笑点头:“Hello!”……你脖子有些酸了。广告词出现“这时,您需要一个Hello函数”!
不过,也许你会担心,写一份函数,然后多处调用,会不会因为这个函数的代码处处出现,从而造成程序文件变得很大呢?
答案是:通常不会,不过也有例外……
〖小提示〗:函数定义只有一份
“张速通”只有一个肉身,上午A家下水道堵塞找他,下午B家马桶堵塞也找他,并不会造成“张速通”被克隆成两份的结果。
例外:有一种函数称为“inline”函数,为了提高办事效率,它们会在每次调用时,都像孙悟空一样,能化身千万。inline可能造成程序的体积急剧增长,并且有严格的实现条件,所以通常我们用得不多。
3.3.4. 带参函数
再次想象又是一个阳光明媚的清晨,你走进公司的大楼,心情很好,接连看到小A、小B、小C……你“Hello、Hello、Hello”不停地微笑点头。突然,前面出现一个秃顶、发福,表情僵硬的人,你一下子紧张了:“Hello,BOSS……”。
不仅仅是对老板啦,对每个人都只是整齐划一地“Hello”,确实有些不礼貌呢。现在就让我们改改Hello函数,让它带上参数。
005 void Hello(string const name)
006 {
007 cout << "Hello! " << name << "." << endl;
008 }
参数的类型: string const 是C++中的常量string,具体含义暂不说明。
string 是C++标准库定义的一个类,我们需要包含它。请在代码第2行加入:
002 #include <string>
〖现场作业〗:观察“函数参数”有关的编译错误
请编译以上代码,然后观察编译出错信息,如果看不到编译信息,请按下F2可以切换出信息窗口,编译出错信息在信息窗口的“构建记录”页中)。
请(至少在字面上)理解以下编译出错信息:
(图 15 编译出错信息(调用函数时,参数个数不足))
作业中出现编译错误,原因在于我们此时调用Hello函数时,没有传递参数给它。请订正此问题:
012 Hello("Xiao A");
013 Hello("BOSS");
我们分别向小A和老板问个好。请编译、运行该程序。
(图 16 带参数Hello函数例子运行结果)
附上本小节最终代码:
#include <iostream>
using namespace std;
void Hello(string const name)
{
cout << "Hello! " << name << "." << endl;
}
int main()
{
Hello("Xiao A");
Hello("BOSS");
return 0;
}