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谁大谁小。
- 【自问自答】关于 Swift 的几个疑问
- 高级PHP应用程序漏洞审核技术【一】
- 【读书笔记】The Swift Programming Language (Swift 4.0.3)
- Ubuntu 下mysql常用操作
- JDK1.8源码(五)——java.util.ArrayList 类
- 代码审计入门总结
- ubuntu mysql启动|停止|重启
- JDK1.8源码(四)——java.util.Arrays 类
- JDK1.8源码(三)——java.lang.String 类
- JDK1.8源码(二)——java.lang.Integer 类
- Java关键字——instanceof
- 【强势推荐】一款可扫描CVE的工具
- Java的深拷贝和浅拷贝
- Java关键字——native
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 商业数据分析从入门到入职(9)Python网络数据获取
- 谈一谈还原解包后小程序页面wxss样式的若干方法
- 什么?不使用selenium爬京东评论?你是不是在骗我
- 骚操作,Python操作PPT,你会吗?
- 用了这个jupyter插件,我已经半个月没打开过excel了
- Mística:一款支持任意协议的应用程序通信工具
- 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
- 原创 | codefroces中的病毒,这题有很深的trick,你能解开吗?
- 原创 | git的远程分支是干啥的,和本地的有什么区别?
- 京东技术主导:全新架构的分布式事务Hmily 2.1.1发布
- iOS音视频接入-TRTC接入前期key、秘钥等准备
- 你一定不知道的 Linux 使用技巧
- 当 Python 爬虫搭配起 Bilibili 唧唧,奇怪的生产力出现了
- 一个简单的小技巧,监控网页所有动态标签创建的调用处
- SAP Spartacus storefrontapp index.html的design time和runtime