第三章 函数

**3.1函数的定义与调用:
3.1.1函数定义
函数是程序代码的一个自包含单元,用于完成某一特
定的任务。
有的函数完成某一操作;
有的函数计算出一个值。 通常,一个函数即能完成某一特定操作,又能计算数值。
为什么要定义函数
避免重复的编程。
使程序更加模块化,便于阅读、修改。
一个程序必须有且只有一个main( )函数,C++从main( ) 函数开始执行。
C++语言中,所有函数都是平行独立的,无主次、相 互包含之分。函数可以嵌套调用,不可嵌套定义。
从用户使用的角度看,函数有两种:
(1) 系统函数,即库函数。这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用他们。
(2) 用户自己定义的函数。用以解决用户的专门需要。
从函数的形式看,函数分两类:
(1) 无参函数。调用函数时不必给出参数。
(2) 有参函数。在调用函数时,要给出参数。在主调函数
和被调用函数之间有数据传递。
参数是函数与外部传输数据的纽带。若函数的定义省略参数表,则称为无参函数;否则为有参函数。
无参函数表示函数不依赖外部数据,执行独立操作。
库函数是C++编译系统已预定义的函数,用户根据需要可以
直接使用这类函数。库函数也称为标准函数。
•C++把一些常用函数作为库函数提供给用户,用户可以直
接使用系统提供的库函数:
•数学计算函数(如sqrt()、pow(),fabs(),exp()等, cmath)
•字符串处理函数(string)
•标准输入输出函数等(iostream),
•用户使用任一库函数时,直接使用,不用定义,但在程序
中必须包含相应的头文件。
如 #include等。

函数的返回值:(转载以及个人补充)

函数的返回值通过return语句获得。函数只能有唯一的
返回值。
函数返回值的类型就是函数的类型。
return语句可以是一个表达式,函数先计算表达式后再返
回值。
return语句还可以终止函数,并将控制返回到主调函数。
return 语句之后的代码是不能执行的代码。
一个函数中可以有一个以上的return语句,执行到哪一
个return语句,哪一个语句起作用。
既然函数有返回值,这个值当然应属于某一个确定的类型,
应当在定义函数时指定函数值的类型。
int max (float a, float b) // 函数值为整型。
函数返回值的类型,也是函数的类型。
不带返回值的函数可说明为void型。
函数的类型与函数参数的类型没有关系。
double blink ( int a, int b)
如果函数的类型和return表达式中的类型不一致,则以
函数的类型为准。函数的类型决定返回值的类型。对数值
型数据,可以自动进行类型转换。
函数的返回主要分为以下几种情况

1、主函数main的返回值:

允许主函数main没有返回值就可结束;可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。

2、返回非引用类型:

函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。
在求解表达式的时候,如果需要一个地方存储其运算结果,编译器会创建一个没命名的对象,这就是临时对象。C++程序员通常用temporary这个术语来代替temporary object。
用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。
当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
3、返回引用类型:

当函数返回引用类型时,没有复制返回值,相反,返回的是对象本身。
千万不要返回局部对象的引用!千万不要返回指向局部对象的指针!
当函数执行完毕时,将释放分配给局部对象的存储空间。此时对局部对象的引用就会指向不确定的内存!返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。

返回引用时,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。///

*3.1.2函数调用:
函数的调用要做两件事情:指定函数地址,提供实际参数。函数名是函数的地址,实际参数提供被调用函数执行任务所需要的信息及接受被调用函数返回的信息。

在这里插入图片描述
在这里插入图片描述
在定义函数时 形式参数和实际参数 函数名后面括号中的变量名称为
形式参数(formal parameter,简称形参)。
形参是被调函数中的变量;
在主调函数中调用一个函数时,函数名后面括
号中的参数(可以是一个表达式)称为实际参数
(actual parameter,简称实参)。
实参是主调函数赋给被调函数的特定值。
实参可以是常量、变量或复杂的表达式,不管是哪
种情况,在调用时实参必须是一个确定的值。
按函数在语句中的作用来分,可以有以下3种函数调用方式
1. 函数语句
把函数调用单独作为一个语句,并不要求函数带回一个值,
只是要求函数完成一定的操作。printstar();
2. 函数表达式
函数出现在一个表达式中,这时要求函数带回一个确定的
值以参加表达式的运算。如c=2*max(a,b);
3. 函数参数
函数调用作为一个函数的实参。如
m=max(a,max(b,c));
在一个函数中调用另一个函数需要具备条件:
(1) 首先被调用的函数必须是已经存在的函数。
(2) 如果使用库函数,应用#include命令将有关头文件
"包含"到本文件中来。
(3) 如果使用用户自定义的函数,函数调用遵循先定义、
后调用的原则,即
被调函数应出现在主调函数之前;
如果被调用函数出现在主调函数之后,则函数必须在主调函数
之前进行声明。

几点说明:

① 在函数调用前,形参并不占内存的存储单元,只有在函
数开始调用时,形参才被分配内存单元。调用结束后,形
参所占用的内存单元被释放。
②实参可以是常量、变量或表达式,但要求有确定的值。
③实参变量对形参变量的数据传递是"值传递",即单向传
递,只由实参传给形参,而不能由形参传回来给实参。在
内存中实参、形参分占不同的单元。
实参与形参一一对应,类型应相同或赋值兼容。
说明:
④不同的函数中可以使用相同的变量名和形参名,他们是
不同的变量。

3.1.3函数原型
函数原型是函数的声明,作用是告诉编译器有关函数借口的信息:函数的名字、函数返回值的数据类型、函数参数的个数、参数类型和参数性质。

3.2函数调用机制**
*3.3.1嵌套调用:
在这里插入图片描述

3.3.2递归调用*
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43427808/article/details/84937090