版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-4-21东华大学计算机学院东华大学计算机学院1面向对象程序设计面向对象程序设计(C+)与实践与实践函数和作用域函数和作用域2022-4-21东华大学计算机学院东华大学计算机学院2主要内容主要内容 函数概述函数概述 函数的定义函数的定义 函数的调用函数的调用 函数的参数函数的参数 内联函数内联函数 函数重载函数重载 标识符存储特性与标识符作用域标识符存储特性与标识符作用域 函数模板函数模板2022-4-21东华大学计算机学院东华大学计算机学院3函数概述函数概述 C+语言认为语言认为函数函数是一个能完成某一独立是一个能完成某一独立功能的子程序,也就是程序模块。功能的子程序,也就是程序模块
2、。 函数函数是在对复杂问题的一种是在对复杂问题的一种自顶向下,逐自顶向下,逐步求精步求精思想的过程。思想的过程。 编程者可以将一个大而复杂的程序分解为编程者可以将一个大而复杂的程序分解为若干个相对独立而且功能单一的小块程序若干个相对独立而且功能单一的小块程序(函数函数)进行编写,并通过在各个进行编写,并通过在各个函数函数之间进之间进行调用,来实现总体的功能。行调用,来实现总体的功能。 函函 数数 概概 述述2022-4-21东华大学计算机学院东华大学计算机学院4函数概述函数概述 函数函数(Function)是功能抽象的模块。是功能抽象的模块。函函 数数 概概 述述函数函数参数参数返回值返回值输
3、入流输入流输出流输出流2022-4-21东华大学计算机学院东华大学计算机学院5函数概述函数概述 在在C+程序中调用程序中调用函数函数之前,首先要对之前,首先要对函函数数进行定义。如果进行定义。如果调用此函数在前,函数调用此函数在前,函数定义在后定义在后,就会产生编译错误。,就会产生编译错误。 为了使函数的调用不受函数定义位置的影为了使函数的调用不受函数定义位置的影响,可以响,可以在调用函数前进行函数的声明在调用函数前进行函数的声明。这样,不管函数是在哪里定义的,只要在这样,不管函数是在哪里定义的,只要在调用前进行函数的声明,就可以保证函数调用前进行函数的声明,就可以保证函数调用的合法性。调用的
4、合法性。函函 数数 概概 述述2022-4-21东华大学计算机学院东华大学计算机学院6函数概述函数概述 函数定义函数定义由两部分组成:由两部分组成: 函数首部;函数首部; 函数操作描述。函数操作描述。 函数的调用函数的调用:通过表达式或语句激活并执行函数代码通过表达式或语句激活并执行函数代码的过程的过程。/ 求圆柱体体积求圆柱体体积# include using namespace std;double volume ( double radius, double height ) return 3.14 * radius * radius * height ; void main( ) do
5、uble vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout Volume = vol endl ;函函 数数 概概 述述2022-4-21东华大学计算机学院东华大学计算机学院7函数概述函数概述 函数定义函数定义由两部分组成:由两部分组成: 函数首部;函数首部; 函数操作描述。函数操作描述。 函数的调用函数的调用:通过表达式或语句激活并执行函数代码通过表达式或语句激活并执行函数代码的过程的过程。/ 求圆柱体体积求圆柱体体积# include using namespace std;double volume ( double radius, d
6、ouble height ) return 3.14 * radius * radius * height ; void main( ) double vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout Volume = vol endl ;函数定义函数定义函函 数数 概概 述述2022-4-21东华大学计算机学院东华大学计算机学院8函数概述函数概述 函数定义函数定义由两部分组成:由两部分组成: 函数首部;函数首部; 函数操作描述。函数操作描述。 函数的调用函数的调用:通过表达式或语句激活并执行函数代码通过表达式或语句激活并执行函数代码的过程的
7、过程。/ 求圆柱体体积求圆柱体体积# include using namespace std;double volume ( double radius, double height ) return 3.14 * radius * radius * height ; void main( ) double vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout Volume = vol endl ;函数调用函数调用函函 数数 概概 述述2022-4-21东华大学计算机学院东华大学计算机学院9函数的定义函数的定义 C+中的每个函数都是从四个方面来进
8、行定义:中的每个函数都是从四个方面来进行定义: 类型标识符;类型标识符; 函数名;函数名; 形式参数表;形式参数表; 函数体。函数体。 语法形式:语法形式:类型标识符类型标识符 函数名函数名(形式参数表形式参数表) 函数体函数体函函 数数 的的 定定 义义是被初始化的内部变量,是被初始化的内部变量,寿命和可见性仅限于函数寿命和可见性仅限于函数内部内部若无返回值,写若无返回值,写void2022-4-21东华大学计算机学院东华大学计算机学院10类型标识符类型标识符 类型标识符类型标识符:指明该函数的类型,也就是:指明该函数的类型,也就是该函数的返回值的类型。该函数的返回值的类型。 此类型可以是此
9、类型可以是C+中除中除函数函数、数组数组类型之类型之外的如何一个合法的数据类型,包括外的如何一个合法的数据类型,包括普通普通类型类型、指针类型指针类型和和引用类型引用类型等。等。 每个函数都要类型。如果在函数定义时没每个函数都要类型。如果在函数定义时没有明确指定类型,则有明确指定类型,则默认类型为默认类型为int。函函 数数 的的 定定 义义2022-4-21东华大学计算机学院东华大学计算机学院11函数的返回值函数的返回值 函数的返回值通常指明该函数处理的结果,函数的返回值通常指明该函数处理的结果,由函数体中的由函数体中的return语句给出。例如:语句给出。例如: return 0; 无返回
10、值的函数无返回值的函数(void类型类型),不必写,不必写return语句,或者语句,或者return的后面什么也没有。的后面什么也没有。函函 数数 的的 定定 义义2022-4-21东华大学计算机学院东华大学计算机学院12函数名函数名 函数名函数名:一个有效的:一个有效的C+标识符,遵循一标识符,遵循一般的命名规则。般的命名规则。 在函数名后面必须跟一对小括号在函数名后面必须跟一对小括号( ),用来,用来将函数名与变量名或其它用户自定义的标将函数名与变量名或其它用户自定义的标识符区分开来。识符区分开来。 在小括号在小括号( )可以没有如何信息,也可以包可以没有如何信息,也可以包含形式参数表。
11、含形式参数表。 主函数的名称主函数的名称规定取编译器默认的名称规定取编译器默认的名称main( )。函函 数数 的的 定定 义义2022-4-21东华大学计算机学院东华大学计算机学院13形式参数表形式参数表 逗号分隔的参数说明表列,缺省形式参数逗号分隔的参数说明表列,缺省形式参数时不能省略圆括号。时不能省略圆括号。 一般形式为:一般形式为: 类型类型 参数参数1 ,类型,类型 参数参数2 , ,类型,类型 参数参数n 无参函数无参函数:函数定义中的:函数定义中的被省略,被省略,或或用用void取代。取代。 带参函数带参函数:若:若不为空,同时又不不为空,同时又不是保留字是保留字void。函函
12、数数 的的 定定 义义2022-4-21东华大学计算机学院东华大学计算机学院14函数体函数体 :一条复合语句,以:一条复合语句,以 开始,到开始,到 结束,中间为一条或若干条结束,中间为一条或若干条C+语句,用语句,用于实现函数执行的功能。于实现函数执行的功能。 注意注意:在一个函数体内允许有一个或多个:在一个函数体内允许有一个或多个return语句,一旦执行到其中某一个语句,一旦执行到其中某一个return语句时,语句时,return后面的语句就不再执行,后面的语句就不再执行,直接返回调用位置继续向下执行。直接返回调用位置继续向下执行。函函 数数 的的 定定 义义2022-4-21东华大学计
13、算机学院东华大学计算机学院15函函 数数 的的 定定 义义函数的形参也可以在函数体外说明。如下例:函数的形参也可以在函数体外说明。如下例:func1( int a, int b ) 也可写成:也可写成:func1( a, b)int a ;int b ; 2022-4-21东华大学计算机学院东华大学计算机学院16#include using namespace std;int func(int n) if( n 0 ) return 1; else if( n = 0 ) return 0; else return -1;void main( ) int n;cout“Please input
14、 n:”n;cout“nthe result:”func(n) endl;示例:函数的定义示例:函数的定义函函 数数 的的 定定 义义2022-4-21东华大学计算机学院东华大学计算机学院17示例:函数的定义示例:函数的定义 此程序的运行结果为:此程序的运行结果为:函函 数数 的的 定定 义义Please input n:2The result:1Please input n:-2The result:-12022-4-21东华大学计算机学院东华大学计算机学院18注意:函数的定义注意:函数的定义 C+中不允许函数定义嵌套中不允许函数定义嵌套。即在函数定。即在函数定义中再定义一个函数是非法的。义
15、中再定义一个函数是非法的。 一个函数只能定义在别的函数的一个函数只能定义在别的函数的外部外部,函,函数定义之间是平行的,互相独立的。数定义之间是平行的,互相独立的。 例如:下面的代码在主函数中非法嵌套了例如:下面的代码在主函数中非法嵌套了一个一个func( )函数定义:函数定义:函函 数数 的的 定定 义义void main( ) void f( ) 2022-4-21东华大学计算机学院东华大学计算机学院19函数的声明函数的声明 函数声明函数声明:也称函数模型:也称函数模型(或函数原型或函数原型)。 在主调函数中,如果要调用另一个函数,在主调函数中,如果要调用另一个函数,则须则须在本函数或本文
16、件中的开头将要被调在本函数或本文件中的开头将要被调用的函数事先作一声明用的函数事先作一声明。 一般格式为:一般格式为: 类型标识符类型标识符 函数名函数名(形式参数表形式参数表); 除了需在函数声明的末尾加上一个分号除了需在函数声明的末尾加上一个分号 ; 之外,其它的内容与函数定义中的第一行之外,其它的内容与函数定义中的第一行(称函数头称函数头)的内容一样。的内容一样。函函 数数 的的 声声 明明2022-4-21东华大学计算机学院东华大学计算机学院20示例:函数的声明示例:函数的声明 例如例如,设有一函数的定义为:,设有一函数的定义为: double func1( double a, int
17、 b, float c ) 函数体函数体 正确完整的函数声明应为:正确完整的函数声明应为: double func1( double x, int y, float z ); /末尾要加上分号末尾要加上分号 函函 数数 的的 声声 明明2022-4-21东华大学计算机学院东华大学计算机学院21示例:函数的声明示例:函数的声明 例如例如,设有一函数的定义为:,设有一函数的定义为: double func1( double a, int b, float c ) 函数体函数体 也可以写为如下形式:也可以写为如下形式: double func1( double , int , float ); /函
18、数声明中省略了形参名函数声明中省略了形参名 函函 数数 的的 声声 明明2022-4-21东华大学计算机学院东华大学计算机学院22示例:函数的声明示例:函数的声明 例如例如,设有一函数的定义为:,设有一函数的定义为: double func1( double a, int b, float c ) 函数体函数体 不能写为如下形式:不能写为如下形式: double func1( x, y, z );/函数声明中省略了形参类型函数声明中省略了形参类型 或:或:func1( double x, int y, float z );/函数声明中省略了函数类型函数声明中省略了函数类型 或:或:double
19、 func1( int y, double x, float z );/函数声明中形参顺序调换函数声明中形参顺序调换函函 数数 的的 声声 明明2022-4-21东华大学计算机学院东华大学计算机学院23函数的调用函数的调用 在在C+中,除了中,除了主函数主函数main由系统自动调用外,由系统自动调用外,其它函数都是其它函数都是由主函数直接或间接调用的由主函数直接或间接调用的。 语法格式:语法格式: 函数名函数名(实际参数表实际参数表) ; 实参应该与函数定义中的形参一一对应实参应该与函数定义中的形参一一对应 个数相等;个数相等; 次序一致;次序一致; 对应参数的数据类型相同或相容。对应参数的数
20、据类型相同或相容。 每个实参是一个表达式,并且必须有确定的值。每个实参是一个表达式,并且必须有确定的值。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院24示例:实参示例:实参函函 数数 的的 调调 用用g1(25) ; /实参是一个整数实参是一个整数g2(x) ; /实参是一个变量实参是一个变量g3(a, 2*b+3) ; /第一个实参是变量,第二个实参是表达式第一个实参是变量,第二个实参是表达式g4(sin(x),) ; /第一个实参为函数调用表达式,第二个实参为字符常量第一个实参为函数调用表达式,第二个实参为字符常量g5(&d, *p, x/y-
21、1) ; /三个实参分别为地址运算、间接访问和一般运算表达式三个实参分别为地址运算、间接访问和一般运算表达式2022-4-21东华大学计算机学院东华大学计算机学院25函数调用方式函数调用方式 常见的常见的函数调用方式函数调用方式有两种。有两种。 方式一方式一: 将函数调用作为一条表达式语句使用,只要求将函数调用作为一条表达式语句使用,只要求函数完成一定的操作,而不使用其返回值。函数完成一定的操作,而不使用其返回值。 若函数调用带有返回值,则这个值将会自动丢若函数调用带有返回值,则这个值将会自动丢失。失。 例如:例如: max( 3, 5 ) ;函函 数数 的的 调调 用用2022-4-21东华
22、大学计算机学院东华大学计算机学院26函数调用方式函数调用方式 常见的常见的函数调用方式函数调用方式有两种。有两种。 方式二方式二: 对于具有返回值的函数,把函数调用语句看作对于具有返回值的函数,把函数调用语句看作语句的一部分,使用函数的返回值参与相应的语句的一部分,使用函数的返回值参与相应的运算或执行相应的操作。运算或执行相应的操作。 例如:例如: int a = max( 3, 5 ) ; int a = max( 3, 5 ) + 1 ; coutmax( 3, 5 )endl;函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院27#include usin
23、g namespace std;int max(int a, int b, int c ) int t; t = a; if( b t ) t = b; if( c t ) t = c; return t;void main( ) int x, y, z;cout“Please input x y z:” xyz; int m = max( x, y, z);cout“The max is:”m endl;示例:函数调用示例:函数调用函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院28函数调用的过程函数调用的过程 当调用一个函数时,整个调用过程分为三当调用一个
24、函数时,整个调用过程分为三步进行:步进行: 第一步第一步:参数传递;:参数传递; 第二步第二步:函数体执行;:函数体执行; 第三步第三步:返回,即返回函数调用表达式的位置。:返回,即返回函数调用表达式的位置。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院29函数调用时的参数传递函数调用时的参数传递 参数传递参数传递称为称为实虚结合实虚结合:即实参向形参传:即实参向形参传递信息,使形参具有确切的含义递信息,使形参具有确切的含义(即具有对即具有对应的存储空间和初值应的存储空间和初值)。 C+有三种参数传递机制:有三种参数传递机制: 值传递;值传递; 地址传递;地
25、址传递; 引用传递。引用传递。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院30值传递值传递 值传递值传递方式:把方式:把实参表达式的值实参表达式的值传送给对传送给对应的应的形参变量形参变量。 以以值传递值传递方式进行参数传递的过程:方式进行参数传递的过程: 首先计算出实参表达式的值;首先计算出实参表达式的值; 接着给对应的形参变量分配一个存储空间,该接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的长度;空间的大小等于该形参类型的长度; 然后把已求出的实参表达式的值一一存入到为然后把已求出的实参表达式的值一一存入到为形参变量分配的存储空间中
26、,成为形参变量的形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。初值,供被调用函数执行时使用。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院31值传递的特点值传递的特点 按照按照值传递值传递方式,被调用函数本身不对实方式,被调用函数本身不对实参进行操作。参进行操作。 即使形参的值在函数中发生了变化,实参即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的的值也完全不会受到影响,仍为调用前的值。值。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院32#include using nam
27、espace std;void swap( int, int );void main( ) int a = 3, b = 4; cout“a=“a“,b=“ bendl; swap( a, b ); cout“a=“a“,b=“ bendl;void swap( int x, int y ) int t = x;x = y; y = t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=3,b=4 示例:值传递示例:值传递函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院33值传递实例:计算圆柱的体积值传递实例:计算圆柱的体积 要求要求:分别定义函数求不
28、同几何体的体积。:分别定义函数求不同几何体的体积。 圆柱体的体积圆柱体的体积 = r2h double CylinderVolume(double r, double h ) ; 圆筒的体积圆筒的体积 = 外外圆柱体的体积圆柱体的体积 内圆柱体内圆柱体的体积的体积 double DonutSize(double Outer, double Inner, double Height)函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院34值传递实例:计算圆柱的体积值传递实例:计算圆柱的体积函函 数数 的的 调调 用用/ 通过参数半径通过参数半径 r 和高度和高度 h
29、,返回圆柱体体积,返回圆柱体体积double CylinderVolume( double r, double h ) const double PI = 3.1415; return PI * r * r * h;/ 通过参数外圆柱体半径通过参数外圆柱体半径 Outer,内圆柱体半径,内圆柱体半径 Inner / 和圆柱体高度和圆柱体高度 Height 返回圆筒体积返回圆筒体积double DonutSize(double Outer, double Inner, double Height) double OuterSize = CylinderVolume(Outer, Height);
30、 double HoleSize = CylinderVolume(Inner, Height); return OuterSize - HoleSize;2022-4-21东华大学计算机学院东华大学计算机学院35值传递实例:计算圆柱的体积值传递实例:计算圆柱的体积函函 数数 的的 调调 用用/ 通过参数半径通过参数半径 r 和高度和高度 h,返回圆柱体体积,返回圆柱体体积double CylinderVolume( double r, double h ) const double PI = 3.1415; return PI * r * r * h;/ 通过参数外圆柱体半径通过参数外圆柱体
31、半径 Outer,内圆柱体半径,内圆柱体半径 Inner / 和圆柱体高度和圆柱体高度 Height 返回圆筒体积返回圆筒体积double DonutSize(double Outer, double Inner, double Height) double OuterSize = CylinderVolume(Outer, Height); double HoleSize = CylinderVolume(Inner, Height); return OuterSize - HoleSize;return CylinderVolume(Outer, Height) - CylinderVol
32、ume(Inner, Height) ;2022-4-21东华大学计算机学院东华大学计算机学院36函函 数数 的的 调调 用用#includeusing namespace std;double CylinderVolume( double r, double h );double DonutSize(double Outer, double Inner, double Height);void main( ) double OuterRadius, InnerRadius, Height; cout OuterRadius ; cout InnerRadius ; cout Height ;
33、 cout size of the donut is : DonutSize( OuterRadius, InnerRadius, Height) endl ;double CylinderVolume( double r, double h ) const double PI = 3.1415; return PI * r * r * h;double DonutSize(double Outer, double Inner, double Height) double OuterSize = CylinderVolume(Outer, Height); double HoleSize =
34、CylinderVolume(Inner, Height); return OuterSize - HoleSize;2022-4-21东华大学计算机学院东华大学计算机学院37值传递实例运行结果:计算圆柱的体积值传递实例运行结果:计算圆柱的体积函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院38地址传递地址传递 地址传递地址传递: 形参指针对应的实际参数是地址表达式,即对象形参指针对应的实际参数是地址表达式,即对象的指针。的指针。 实际参数把对象的地址值赋给形式参数名标识的实际参数把对象的地址值赋给形式参数名标识的指针变量。指针变量。 被调用函数通过形参指针间
35、接访问实参所指对象。被调用函数通过形参指针间接访问实参所指对象。 特点特点:与值传递不同,它把实参的存储地址:与值传递不同,它把实参的存储地址传送给对应的形参,从而使得形参指针和实传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改中对形参指针所指向的地址中内容的任何改变都会影响到实参。变都会影响到实参。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院39#include using namespace std;void swap( int *, int * )
36、;void main( ) int a = 3, b = 4; cout“a=“a“,b=“ bendl; swap( &a, &b ); cout“a=“a“,b=“ bendl;void swap( int *x, int *y ) int t = *x;*x = *y; *y = t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=4,b=3 示例示例1:地址传递:地址传递函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院40#include using namespace std;void func ( int * p ) ;v
37、oid main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院41#include using namespace std;void func ( int * p ) ;void main( ) int x =
38、20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 x2022-4-21东华大学计算机学院东华大学计算机学院42#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &
39、x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 x2022-4-21东华大学计算机学院东华大学计算机学院43#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“
40、 x endl ;void func ( int * p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 xp2022-4-21东华大学计算机学院东华大学计算机学院44#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void f
41、unc ( int * p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 x&xp*p2022-4-21东华大学计算机学院东华大学计算机学院45#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( i
42、nt * p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 x&xp10a*p2022-4-21东华大学计算机学院东华大学计算机学院46#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int *
43、 p ) int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 x&xp10a*p2022-4-21东华大学计算机学院东华大学计算机学院47#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p )
44、 int a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用20 x&xp10a*p2022-4-21东华大学计算机学院东华大学计算机学院48#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int
45、 a = 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 x&xp10a*p2022-4-21东华大学计算机学院东华大学计算机学院49#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a =
46、 10 ; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 x&xp10a*p2022-4-21东华大学计算机学院东华大学计算机学院50#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10
47、; *p += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 xp10a*p&a2022-4-21东华大学计算机学院东华大学计算机学院51#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p
48、 += a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 xp10a*p&a2022-4-21东华大学计算机学院东华大学计算机学院52#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p +=
49、a ; p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 xp10a*p&a2022-4-21东华大学计算机学院东华大学计算机学院53#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p += a ;
50、p = &a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 xp20a*p&a2022-4-21东华大学计算机学院东华大学计算机学院54#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p += a ; p =
51、&a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 xp20a*p&a2022-4-21东华大学计算机学院东华大学计算机学院55#include using namespace std;void func ( int * p ) ;void main( ) int x = 20 ; func( &x ) ; cout “x =“ x endl ;void func ( int * p ) int a = 10 ; *p += a ; p = &
52、;a; *p = *p + a ; cout *p = *p endl ; cout a = a endl ;示例示例2:地址传递:地址传递函函 数数 的的 调调 用用30 xp20a*p&a2022-4-21东华大学计算机学院东华大学计算机学院56按值传递与地址传递的比较按值传递与地址传递的比较 按值传递方式按值传递方式:容易理解,但形参值的改:容易理解,但形参值的改变不能对实参参数影响。变不能对实参参数影响。 地址传递方式地址传递方式:虽然可以使得形参的改变:虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序
53、容易产利用指针进行间接访问,会使程序容易产生错误且难以阅读。生错误且难以阅读。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院57引用传递引用传递 引用传递引用传递:以引用作为参数,既可以使得:以引用作为参数,既可以使得对形参的任何操作都能改变相应的实参的对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然。数据,又使函数调用显得方便、自然。 引用传递方式引用传递方式是在函数定义时在形参前面是在函数定义时在形参前面加上引用运算符加上引用运算符&。函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院58#in
54、clude using namespace std;void swap( int &, int & );void main( ) int a = 3, b = 4; cout“a=“a“,b=“ bendl; swap( a, b ); cout“a=“a“,b=“ bendl;void swap( int &x, int &y ) int t = x;x = y; y = t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=4,b=3 示例:引用传递示例:引用传递函函 数数 的的 调调 用用2022-4-21东华大学计算机学院东华大学计算机学院59函
55、数参数的求值顺序函数参数的求值顺序 当一个函数带有多个参数时,当一个函数带有多个参数时, C+没有规没有规定在函数调用时实际参数的求值顺序。定在函数调用时实际参数的求值顺序。 有的编译器规定自左至右,有的编译器规定自有的编译器规定自左至右,有的编译器规定自右至左。右至左。 若实际参数表达式之间有求值关联,同一若实际参数表达式之间有求值关联,同一个程序在不同编译器个程序在不同编译器可能产生不同的运行可能产生不同的运行结果结果。函函 数数 的的 参参 数数2022-4-21东华大学计算机学院东华大学计算机学院60示例:函数参数的求值顺序示例:函数参数的求值顺序函函 数数 的的 参参 数数#incl
56、ude using namespace std;int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout 5 + 11 = z ?!n ;从右向左计算实参表从右向左计算实参表xyz46xy10 x+y2022-4-21东华大学计算机学院东华大学计算机学院61示例:函数参数的求值顺序示例:函数参数的求值顺序函函 数数 的的 参参 数数#include using namespace std;int add ( int x , int y
57、 ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout 5 + 11 = z ?!n ;从右向左计算实参表从右向左计算实参表46xyz56xy10+ x52022-4-21东华大学计算机学院东华大学计算机学院62示例:函数参数的求值顺序示例:函数参数的求值顺序函函 数数 的的 参参 数数#include using namespace std;int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y
58、 = 6 ; int z = add ( + x , x + y ) ; cout 5 + 11 = z ?!n ;从右向左计算实参表从右向左计算实参表xyz565xy10obj5 + 102022-4-21东华大学计算机学院东华大学计算机学院63示例:函数参数的求值顺序示例:函数参数的求值顺序函函 数数 的的 参参 数数#include using namespace std;int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout
59、 5 + 11 = z ?!n ;从右向左计算实参表从右向左计算实参表15xyz565xy10obj155 + 102022-4-21东华大学计算机学院东华大学计算机学院64示例:函数参数的求值顺序示例:函数参数的求值顺序函函 数数 的的 参参 数数#include using namespace std;int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout 5 + 11 = z ?!n ;15xyz562022-4-21东华大学
60、计算机学院东华大学计算机学院65示例:函数参数的求值顺序示例:函数参数的求值顺序函函 数数 的的 参参 数数#include using namespace std;int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout 5 + 11 = z ?!n ;修改程序修改程序 + x ; int z = add ( x , x + y ) ; cout 5 + 11 = z n ;2022-4-21东华大学计算机学院东华大学计算机学院66默认形参值默认形参值 C+允许指定形参的默认值。允许指定形参的默认值。 函数在声明时可以预先给出默认的形参值:函数在声明时可以预先给出默认的形参值: 调用时如给出实参,则采用实参值;调用时如给出实参,则采用实参值; 否则采用预先给出的默认形参值。否则采用预先给出的默认形参值。 默认参数默认参数在函数原型处定义。在函数原型处定义。 默认参数默认参数放在一般参数之后。如:放在一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年交管12123学法减分复习考试题库及答案【历年真题】
- 2026年劳务员之劳务员基础知识考试题库200道及答案(有一套)
- 餐饮行业员工培训及服务标准
- 医药企业质量管理体系岗位职责说明
- 2026年房地产经纪协理之房地产经纪操作实务考试题库附答案(培优b卷)
- 高校英语写作提分技巧指导
- 吉林省吉林市舒兰市2023-2024学年九年级上学期第一次月考化学考题及答案
- 吉林省吉林市舒兰市2023-2024学年八年级上学期第一次月考英语试题及答案
- 行政部门职能与岗位职责操作手册
- 八年级英语单词学习方法与技巧
- TSDLPA 0001-2024 研究型病房建设和配置标准
- 党史专题讲座智慧树知到期末考试答案章节答案2024年哈尔滨工程大学
- DMAIC六西格玛项目报告模板
- 预防褥疮气垫床临床应用
- 银行开学季营销活动
- 如何激励学生学习的积极性和主动性
- 百词斩雅思核心词汇
- 蒸汽和凝结水管道设计
- 股骨粗隆间骨折课件
- 过盈配合压装力计算
- 西方哲学史期末考试试题及答案
评论
0/150
提交评论