c++---函数

一、函数的介绍     在过程化编程中, 为了将一个较大的功能顺利实现, 通常会将这个大的功能进行分解, 例如要实现一个学生信息管理系统, 一个学生信息管理系统至少包括学生信息的 添加查询删除修改 等功能, 这些功能要求就是对该系统的初步分解, 然后以 查询 功能为例对其继续分解, 查询 功能可以再次分解为由以下几个功能组成的模块: ①. 获取用户查询条件 ; ②. 到数据库查询该学生信息 ; ③. 按照一定格式输出查询结果。     如果感觉该功能实现起来还是比较困难那么就继续分解, 直到可以顺利实现。这些功能分解后的实现就是依靠函数, 函数在广义上理解为具有具体功能的一个模块, 在函数实现后, 通过对函数的调用来使用这个功能。

二、函数的调用过程     在任何一个有效的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谁大谁小。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

python3--小数据池,is,字符编码

python3x中的str在内存中的编码方式是unicode. python3x中的str不能直接存储和发送

23810
来自专栏专注数据中心高性能网络技术研发

[C++]C++面试知识总结

1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: ? 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS...

34640
来自专栏null的专栏

挑战数据结构与算法面试题——统计上排数在下排出现的次数

题目来源“数据结构与算法面试题80道”。在此给出我的解法,如你有更好的解法,欢迎留言。 ? 分析: 本题应该是一个确定的问题,即上排的是个数是题目中给定的...

33260
来自专栏mukekeheart的iOS之旅

OC学习2——C语言特性之函数

1、OC是在C语言的基础上进行扩展的,在OC中直接用C语言进行coding也是可以通过编译的。因此,函数定义的语法格式如下: 函数返回值类型 函数名(形参列表...

33570
来自专栏西安-晁州

js数组去重

对于如下对象数组 [{id: 0, name: "name1"}, {id: 1, name: "name2"},{id: 1, name: "name2"},...

30500
来自专栏Python

Python常见数据结构整理 Python常见数据结构整理

Python常见数据结构整理 Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要...

20470
来自专栏黑泽君的专栏

c语言基础学习07_指针

=============================================================================

29100
来自专栏Python

python ——面向对象进阶

1.staticmethod和classmethod staticmethod  静态方法: 让类里的方法,直接被类调用,就像正常的函数一样 宝宝,男 博博,女...

21370
来自专栏北京马哥教育

python模块之re正则表达式详解

正则表达式是一种小型的、高度专业化的编程语言,并不是python中特有的,是许多编程语言中基础而又重要的一部分。在python中,主要通过re模块来实现。这篇文...

42590
来自专栏codingforever

经典算法巡礼(二) -- 排序之选择排序

选择排序,如冒泡排序一样,从名字中即可大概猜测其排序的原理。其工作原理就是从未排序的数组中选出最大(小)的元素,将其放置至数组的首(尾)部,重复此过程直至没有未...

4510

扫码关注云+社区

领取腾讯云代金券