学习C++ -> 函数( Function )
一、函数的介绍
在过程化编程中, 为了将一个较大的功能顺利实现, 通常会将这个大的功能进行分解, 例如要实现一个学生信息管理系统, 一个学生信息管理系统至少包括学生信息的 添加、查询、删除、修改 等功能, 这些功能要求就是对该系统的初步分解, 然后以 查询 功能为例对其继续分解, 查询 功能可以再次分解为由以下几个功能组成的模块:
①. 获取用户查询条件 ;
②. 到数据库查询该学生信息 ;
③. 按照一定格式输出查询结果。
如果感觉该功能实现起来还是比较困难那么就继续分解, 直到可以顺利实现。这些功能分解后的实现就是依靠函数, 函数在广义上理解为具有具体功能的一个模块, 在函数实现后, 通过对函数的调用来使用这个功能。
二、函数的调用过程
在任何一个有效的C++程序中, 都有一个被称为主函数的函数 - main(), 该函数又被称为C++程序的入口函数, 该函数的作用是告诉程序应该从这里开始执行指令, 也就是说, 任何一个C++程序都是从 main() 函数处开始执行, 直到执行过程中遇到程序的结束指令。
C++中, 函数的之间可以互相调用, 不存在函数的等级关系而导致的不行调用的情况。 也就是说, main函数可以调用任何函数, 也包括自身; 自定义的函数可以调用其他自定义的函数, 或者库函数, 自定义函数同样也可以调用main函数。
其一般的调用关系如图:
对图示中的解说:
在该图示中, 用箭头来描述调用关系, 箭头指向谁就表明谁被调用, 箭头的尾部是指函数在那里被使用。可以看到, 图中main()函数一共调用了 函数1()、函数2()、...函数n()这些函数, 而 函数1() 的实现又调用了 函数3, 函数3 的实现又调用了 函数2 才得以完成。函数2被重复调用了两次, 一次是在 main() 函数中, 一次是在函数3()中, 相当于被重复利用了两次。
在这个图示中就体现出了使用函数的另一个优势, 代码可以反复利用, 把一些简单基础的功能写成一个函数, 什么时候使用就什么时候调用, 不必再麻烦的写一次。
三、一个函数的示例
这里举例通过调用一个函数来输出"hello, world":
1 #include<iostream> 2 3 using namespace std; 4 5 //定义sayHello函数 6 void sayHello() 7 { 8 //大括号里面为函数功能的实现 9 cout<<"Hello, world!\n" ; 10 } 11 12 int main() 13 { 14 sayHello() ; //调用自定义的sayHello函数 15 16 return 0 ; 17 }
编译运行后将在屏幕上输出"hello, world", 与直接在main函数中使用cout输出的结果相同。 在这个示例中, 我们定义了名为 sayHello 的函数, 名字的前面 void 是他的返回值类型, 紧跟着后面的大括号中的内容就是该函数具体的实现过程, 也称为函数体, 由于我们给该函数的功能为在屏幕上输出 "hello, world" 即可, 所以函数体内只写了一行 cout<<"Hello, world!\n" ;。
定义完sayHello函数就可以在main函数中调用了, 调用的过程很简单, 函数名加一对小括号再加上后面的分号即可。
四、函数的定义以及调用
一个函数的定义是有函数头与函数实现部分组成, 一般形式如下:
返回值类型 函数名(参数列表)
{
函数体
}
1>. 返回值类型
函数在执行完毕后会返回一个值表示函数已经执行完毕, 这个值可以是随便定义的一个值, 也可以是函数经过计算/操作后得到的结果, 他可以是 char、int、float、double、指针类型等, 也可以是后面将会学到的自定义数据类型。
要返回某个值需要用 return 语句; 来进行返回。 当函数执行到 return 语句时会返回一个值并结束函数的执行, 即使后面还有语句也不会再执行了。
例如我们把上面那个sayHello函数改成有返回值类型的如下:
1 #include<iostream> 2 3 using namespace std; 4 5 //定义sayHello函数 6 int sayHello() 7 { 8 //大括号里面为函数功能的实现 9 cout<<"Hello, world!\n" ; 10 return 100 ; //执行完毕时返回值100 11 cout<<"succeed!\n" ; 12 13 } 14 15 int main() 16 { 17 int val = 0; 18 val = sayHello() ; //调用自定义的sayHello函数, 把返回值赋值给变量val 19 cout<<"Return Value: "<<val<<endl ; //输出sayHello函数的返回值 20 21 return 0; 22 }
输出:
Hello, world! Return Value: 100 Process returned 0 (0x0) execution time : 0.594 s Press any key to continue.
这次把 sayHello 函数的返回类型改为了int, 其返回值为100, 并且我们还是 return 语句后加了一句 cout<<"succeed!\n" ; 用于判断函数执行到return语句时是否真的结束了, 根据输出结果来看, 真的结束了, 后面的 "succeed!" 没有被输出 。
在main函数中定义了一个int型(与返回值类型一致)的变量val用来保存sayHello函数的返回值, 并将他输出。
2>. 函数名
函数名只要符合C++标识符定义的要求即可, 即只能以字母、数字、下划线组成, 并且不能以数字开头。在符合要求的基础上尽量让命名简洁明确, 最好能让人一看函数名就能大致猜测出该函数的功能是什么。
3>. 参数列表
参数列表是用来向函数内传递信息, 比如要要函数来比较两个数的大小, 并输出较大的那个, 不让函数知道哪两个数怎么行。
例: 向函数传递两个int型值输出较大的一个
1 #include<iostream> 2 3 using namespace std; 4 5 //定义max函数 6 void max(int a, int b) //int a, int b即为参数列表 7 { 8 if(a>b) 9 cout<< a << endl ; 10 else 11 cout<< b << endl ; 12 } 13 14 int main() 15 { 16 int x = 10, y = 20 ; //待比较的数 17 max(x, y) ; //调用并传入x和y的值 18 19 return 0; 20 }
在声明参数列表时, int a, int b, 为两个int型, 表示将要传入两个参数, 传入的第一个参数将由a表示, a的值就是传进来的第一个参数的值; 第二个参数由b表示, 同样, b的值就是传进来第二个参数的值, a、b称为形参, 也称"形式参数"。
main函数中调用max函数传入的为x, y, 这里x, y称为实参。所以在该程序中, 参数列表中a的值就是x的值, b的值就是y的值, 因此我们就可以在函数体内根据a, b的值判断x, y谁大谁小。
今天主要学习了有关函数的一些基础知识, 明天将继续对函数进行进一步的学习。
命运如同手中的掌纹,无论多么曲折,但终掌握在自己手中。
--------------------
wid, 2013.01.23
上一篇: 学习C++ -> 引用( References )