文章目录
- 前言
- 1复习函数的基本知识
- 1.1定义函数
- 1.2函数原型和调用函数
- 2函数的参数和按值传递
- 2.1多个参数
- 2.2另一个接受两个参数的函数
- 3函数和数组
- 3.1函数如何用指针来处理数组
- 3.2将数组作为参数意味着什么
- 3.3更多的数组函数示例
- 3.4使用数组区间的函数
- 3.5指针和const
- 4函数和二维数组
- 5函数和C风格字符串
- 5.1将C风格字符串作为参数的函数
- 5.2返回C风格字符串的函数
- 6函数和结构
- 6.1传递和返回结构
- 6.2另一个处理结构的函数示例
- 6.3传递结构的地址
- 7函数和string对象
- 8函数与array对象
- 9递归
- 9.1包含一个递归调用的递归
- 9.2包含多个递归调用的递归
- 10函数指针
- 10.1函数指针的基础知识
- 10.2函数指针的示例
- 10.3深入探讨函数指针
- 10.4使用typedef进行简化
- 11总结
- 12 参考
前言
函数无论对于哪种语言来说都意义重大,之前学习的基本概念,变量的基本类型,符合类型;函数中的顺序语句,循环语句,条件语句等都最终为了函数服务。在程序开发的初期阶段,为了实现某个具体函数,开发人员都是在了解功能需求之后开始写函数,进而实现相应的功能。后期,这种类似的开发的函数写多了,便可以从整体项目着手,开始对项目的架构进行构建,所以函数是基础,得掌握函数的基本知识。
1复习函数的基本知识
要使用C++函数,必须完成以下工作:
1)提供函数定义;
2)提供函数原型;
3)调用函数
在创建自己的函数时。必须自行处理这三个方面——定义,提供原型和调用。
1.1定义函数
此处可以将函数分为两大类:有返回值的函数,没有返回值的函数。
1)没有返回值的函数:
函数原型:
void functionname(parameterList){statements(s);return;
}
2)有返回值的函数:
函数原型:
typeName functionname(parameterList){statements(s);return value;
}
1.2函数原型和调用函数
- 1)为什么需要原型
原型编译了函数到编译器的接口,也就是说,它将函数返回值的类型以及参数的类型和数量告诉给编译器。可以这样理解,你是老板要各自分配工作,你起码得在工作之前,把大家的名字都知道一下。
- 2)原型的语法
函数原型是一条语句,因此必须以分号结束,获得原型最简单的办法就是,复制函数定义的函数头然后添加分号。
- 3)原型的功能
a.编译器正确处理函数返回值;
b.编译器检查使用的参数数目是否正确;
c.编译器检查使用的参数类型是否正确;如果不正确,则转化为正确的类型;
2函数的参数和按值传递
C++按数值传递参数,用于接受传递值的变量被称为形参,传递给函数的数值被称为实参。
2.1多个参数
函数可以有多个参数,只需要使用逗号将这些参数分开,同时要明确声明每个参数的类型。书中给出了示例程序。
2.2另一个接受两个参数的函数
书中用另一个公式来计算可能性,程序上稍显复杂,原理一致。
3函数和数组
首先书中给出了示例代码,演示如同使用数组名一样使用指针。
3.1函数如何用指针来处理数组
将数组名视为指针,对数组名使用sizeof()将得到整个数组的长度。
3.2将数组作为参数意味着什么
传递的是数组的位置(地址),包含的元素种类(类型),以及元素数目(n变量)。书中也给出了示例代码。
3.3更多的数组函数示例
项目中会对数组进行操作,一般情况下初始化,赋值操作较为常见。如果说对数组的操作较为频繁,可以对初始化,赋值操作单独拎出来写一个功能函数。
3.4使用数组区间的函数
指定元素区间,通过传递两个指针来完成:一个指针标识数组的开头,一个指针标识数组的结尾。
3.5指针和const
可以用两种不同的方式将const关键字用于指针:第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的数值;第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置。
4函数和二维数组
以整型数组为例,数组的成员是一个整型数字;但是对于二位数组,数组中的一个元素,则是一维数组。以ar2[r][c]这个二维数组为例,
ar2[c][r] = *(*(ar2+r)+c) //表示相同的元素
ar2 // 指针指向第一行的4个元素
ar2+r //指向二维数组的第r行
*(ar2+r) //数组的第r行
5函数和C风格字符串
5.1将C风格字符串作为参数的函数
将字符串作为参数来传递,但实际传递的是字符串第一个字符的地址,这意味着字符串函数原型应该将其表示为字符串的形参声明为char*类型。
5.2返回C风格字符串的函数
书中编写了一个返回字符串的函数;函数无法返回一个字符串,但是可以返回字符串的地址,这样的效率更高。
6函数和结构
6.1传递和返回结构
当结构比较小时,按值传递结构比较合理,书中给出了相应的示例。
6.2另一个处理结构的函数示例
书中给出的示例用了两个结构。
6.3传递结构的地址
要传递结构的地址而不是整个结构,函数在运行时便会节省时间和空间,函数传入的参数都是指向结构体的指针。
7函数和string对象
书中给出了一个小型示例,声明了一个string对象数组,并将该数组传递给一个函数以显示其内容。
8函数与array对象
书中给出了一个示例,处理array对象;就是用array对象来存储一年四个季度的开支,然后计算中总和,打印下来。
9递归
递归简单来说就是函数自己调用自己。
9.1包含一个递归调用的递归
void recurs(argumentlist){statement1if(test)recurs(arguments)statement2
}
当调用链为false时,调用链将断开。注意当test的返回值一直为true时,每个recurs()都会执行statement1,然后再调用recurs(),而不会执行statement2。只有当test返回值为false时,才会逆序执行statement2。书中给出了示例程序。
每次递归调用都会创建属于自己的一套变量。
9.2包含多个递归调用的递归
在需要将一份工作不断分为两项较小的,类似的工作时,递归非常有用,书中给出了示例代码。
10函数指针
10.1函数指针的基础知识
使用函数指针需要完成3个工作
(1)获取函数的地址
(2)声明一个函数指针
(3)使用函数指针来调用函数
10.2函数指针的示例
书中给出了示例代码。
10.3深入探讨函数指针
书中给出了示例代码。
注意pa与&pa的区别,pa都是数组第一个元素的地址,即&pa[0],它是单个指针的地址;&pa是整个数组的地址。pa+1表示的是数组中下一个元素的地址,&pa+1表示横跨整个内存块后的地址。
10.4使用typedef进行简化
Typedef是对变量类型起了个别名。
11总结
书上的总结是对7.1-7.10知识点的概括,C++在函数方面进行了相应的扩展,这才是需要重点进行掌握的。
12 参考
12.1 《C++ Primer Plus》