相关博客目录
C++程序设计基础学习笔记:(1)初识C++语言:从认识变量和常量开始,数据的表示
C++程序设计基础学习笔记:(2)计算:从数据运算开始,数据简单运算
C++程序设计基础学习笔记:(3)分支结构:无处不在的抉择
C++程序设计基础学习笔记:(4)循环结构:周而复始,求同存异
C++程序设计基础学习笔记:(5)数组:实现算法的利器
C++程序设计基础学习笔记:(6)指针:所向披靡的“金箍棒” 魂
C++程序设计基础学习笔记:(7)函数:面向过程的基础
C++程序设计基础学习笔记:(8)文件:让数据流动起来
C++程序设计基础学习笔记:(9)以人为本:用类与对象诠释现实世界
C++程序设计基础学习笔记:(10)从生物遗传说起,取其精华——继承与多态
第7章 函数:面向过程的基础
7.1 从最大值的计算看函数的概念和定义
为什么需要函数
避免了重复性操作;
分而治之思想:把一个复杂的问题分解为若干简单的问题,每个简单的问题是一个独立的功能模块,每个模块用函数实现;
什么是函数?
能够完成特定功能的独立代码块;
能够接受数据,并对接受的数据进行处理;也可以不接受数据;可以返回结果也可以不返回结果;
归纳:函数是一个工具,是为了解决大量类似问题而设计的;
要点:代码封装
函数定义
一般形式:
(void为无返回值)
return语句
功能:
终止函数执行,返回想要的返回值
三种使用方式:
(表达式的类型需要与定义的返回类型相同)
return 表达式; return (表达式); return;
- 1
- 2
- 3
注意事项:
在函数中允许有多个return 语句(通常在条件语句中);
当任意一个return 语句执行时,结束函数的执行,返回到调用函数的位置。表达式的类型应跟返回值的类型保持一致,否则,将自动进行类型转换;
对于没有返回值的函数,可以明确定义为空类型“void”;
7.2.1 函数的调用和声明
函数调用的执行过程
源程序中定义的函数只有被主调函数调用才会被执行,否则不会被执行!
函数可以被执行多次。
函数调用指程序控制从主调函数处转向被调函数处执行,其执行过程如下图所示:
形参与实参
形参
位置:出现在被调函数的定义中
作用:定义了函数对外的接口
特点:局部变量
生存期:函数的运行期
作用域:函数体的所有语句
实参
位置:出现在主调函数中
作用:调用时,为被调函数的形参提供实际值
特点:表达式
函数调用
主调函数通过函数名调用被调函数,如果被调函数有形参,则主调函数中的函数调用语句须在调用的时候为函数提供对应的实际参数;
调用格式:
函数名(实参表) 有返回值: m=funMax(x,y); //表达式形式的调用 无返回值: fun(a, b) ; //语句形式的调用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
函数声明
意义
在调用函数前先声明其返回值类型、函数名和参数;
函数声明有助于编译器对函数参数类型的匹配检查;
一个函数声明需要给三个关键部分:
函数的名字
函数返回值的类型
调用这个函数的时候必须提供的参数的个数和参数类型。
函数声明的语法格式
数据类型函数名(形参列表);
- 1
形参的名字可以省略
函数声明中的“;”不可少
函数声明最佳位置
通常将函数的声明放在主函数外,程序开始处;如果放在主调函数中,则只有主调函数能调用该函数
7.2.2 函数的进一步讨论
函数重载
有些函数实现的是同一类的功能,只是形参类型或者个数不同。
函数重载是指在同一个作用域中,可以有一组具有相同函数名,不同参数列表的函数(可以是类型也可以是数量),这组函数称为函数重载。函数重载减少函数名的数量,提高程序的可读性。利用函数重载,举例如下:
注意事项:不能够只依靠函数的返回值类型不同或形参变量名不同来实现函数重载
默认形参值
定义:
通常函数调用时形参从实参获取具体值,因此实参的个数应与形参相同。但通过设置形参的默认值,可以灵活给出实参个数(即为有些形参不需要通过实参提供值)。
规则:
如果给出实参,则采用实参值,否则采用预先给出的默认值。带默认形参值的函数可以简化编程,提高运行效率。
使用带有默认参数的函数时要注意:
指定默认值的参数必须放在形参表列中的最右端;
如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时不能再给出默认值,即使默认值相同也不可以;
当重载函数与默认参数共同使用时,要注意出现二义性问题
func(int); //重载函数1,只有1个参数,无默认参数 func(int, int =4);//重载函数2,有2个参数,有1个默认参数 func(int a=3, int b=4, int c=6);//重载函数3,有3个参数,有3个默认参数 fucn(float a=3.0, float b=4.0 float c=5.0);//重载函数4,有3个参数,有3个默认参数 fucn(float a=3.0, float b=4.0 float c=5.0 float d=7.9 );//重载函数5,有4个参数,有4个默认参数
- 1
- 2
- 3
- 4
- 5
- 6
func(2); //可调用前3个函数,出现二义性
func(2.0); //可调用后2个函数,出现二义性所以当重载函数与默认参数共同使用时,要注意出现二义性问题。
return语句返回指针的情况
7.3 变量的作用域与生存期
变量的作用域与生存期
变量的作用域
变量起作用的语句范围:
文件作用域:例如: a
函数或者块作用域:例如: b、c
变量的生存期
变量能保存值的时间范围
变量的种类
局部变量
具有函数作用域或块作用域的变量。
特点:在其作用域内的所有函数均可使用它。
优点:增强模块的内聚性。
全局变量
具有文件作用域的变量。
特点:只有定义变量的函数才可使用它
缺点:增加了模块之间的耦合度,使得程序的维护代价升高,模块的可移植性降低。
变量的存储类别
语法:
存储类别 数据类型 变量名[, …] (一般省略存储类别之后默认为auto)
- 1
注:形参也是自动型变量
自动变量与静态变量
自动变量
静态变量
在初始化结束后在此进入函数,如果有初始值,静态变量不会在此初始化
外部变量
作用:延展全局变量的作用域。
7.4 参数传递的意义与作用
为什么需要参数传递
函数之间共享数据是通过参数传递完成的;
函数封装的体现
外界对函数的影响仅限于传递的参数,把函数内的具体实现细节对外隐藏,只要参数不变,不影响函数的使用
函数对外界的影响仅限于函数的返回值以及传数组及指针形参;
参数传递—值传递
方式:函数的形参的类型为简单变量。
系统会建立一份实参的拷贝给形参。
当函数调用完毕,这份实参的拷贝消失。
特点:传值调用不会影响实参的值。
参数传递—地址传递
地址传递的特征,形参的改变会影响实参的改变;
地址传递讨论以下三种情况
指针
数组名(其实也是指针)
引用
形参为指针
形参为数组的首地址
数组名作函数参数时所进行的传送是地址的传送,也就是把实参数组的
首地址赋予形参数组名。形参数组名取得该首地址之后与实参数组为同
一数组,共同拥有一段内存空间。
形参为二维数组的首地址
形参采用引用
引用变量可以看成是另一个变量的别名,因此被调函数对形参做的任何操作都影响了主调函数中的实参变量。
在函数外部不能适用ab的原因是因为他们是局部变量
7.5 递归算法
递归
核心思想是分解。把一个复杂的问题使用同一个策略将其分解为较简单的问题,如果这个问题仍然不能解决则再次分解,直到问题能被直接处理为止。
递归算法是指一种通过重复将问题分解为同类的子问题而解决问题的方法。这种直接或间接地调用自身的算法称为递归算法。实现该算法的函数称为递归函数。
包括要素:
函数体内有一个直接或者间接调用自身的部分
有终止的边界条件
评论记录:
回复评论: