第4讲函数 °教学目的与要求 了解内联函数的声明及作用。 掌握函数的定义与调用及带默认参数的函数。 教学内容提要: 1、函数的定义与调用; 2、内联函数; 3、带默认参数的函数; 教学重点:带默认参数的函数。 教学难点:带默认参数的函数 教学进度:P26~P31 教学过程:
•教学目的与要求: 了解内联函数的声明及作用。 掌握函数的定义与调用及带默认参数的函数。 •教学内容提要: 1、函数的定义与调用; 2、内联函数; 3、带默认参数的函数; •教学重点:带默认参数的函数。 •教学难点:带默认参数的函数。 •教学进度:P26~P31 •教学过程: 第 4 讲 函数
三函数是一个能完成某一独立功能的子程序,也就是程序模块。每个 CH程序至少包含一个函数,即min函数(主函数)。在面向过程的程序 设计中,一个较为复杂的程序一般通过模块化,分解成主模块与若千子模 块的组合,即一个主函数与若干子函数。程序是以函数为单位,由一个或 多个函数组成的。 在面向对象的程序设计中,一个C艹程序是由类的实例(对象)构成。 函数主要用于定义对象的操作接口 本章介绍有关函数的一些基本知识,如:函数的定义及调用等。这些 知识虽然大部分是建立在面向过程的程序设计方法的基础上,但它们也是 我们学习面向对象程序设计的基础。 41函数的定义及调用】 在面向过程的程序设计中,一个C++程序由一个或多个函数组成。当 程序开始运行时,系统自动调用主函数。主函数可以调用子函数,子函数 还可以调用其他子函数。 调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数
函数是一个能完成某一独立功能的子程序,也就是程序模块。每个 C++程序至少包含一个函数,即main函数(主函数)。在面向过程的程序 设计中,一个较为复杂的程序一般通过模块化,分解成主模块与若干子模 块的组合,即一个主函数与若干子函数。程序是以函数为单位,由一个或 多个函数组成的。 在面向对象的程序设计中,一个C++程序是由类的实例(对象)构成。 函数主要用于定义对象的操作接口。 本章介绍有关函数的一些基本知识,如:函数的定义及调用等。这些 知识虽然大部分是建立在面向过程的程序设计方法的基础上,但它们也是 我们学习面向对象程序设计的基础。 在面向过程的程序设计中,一个C++程序由一个或多个函数组成。当 程序开始运行时,系统自动调用主函数。主函数可以调用子函数,子函数 还可以调用其他子函数。 调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。 【 4.1 函数的定义及调用】
(41.1函数的定义】 ☆在C++程序中,使用函数前首先需要声明函数,然后定义函数 声明函数,就是告诉编译器函数的名称、类型和形式参数 定义函数,就是告诉编译器函数所做的工作 ☆函数不能调用没有声明的函数。 个标识符,在命名时 其中主函数的名称应取 在C十+程序中,定义一个函数的格式如下:编译器默认的名称min 类型函数名(形式参数表) 可以有0条、1条或多条语句。 该函数的类型,即该语句序列 当是0条语句时,该函数称作 函数返回值的类型。 空函数。 函数的返回值是需要返回给主调函数处理的结果,由 return语句给出。当 该函数没有返回值时,函数的类型为void,可不写 return语句
声明函数,就是告诉编译器函数的名称、类型和形式参数。 ☆ 在C++程序中,使用函数前首先需要声明函数,然后定义函数。 在C++程序中,定义一个函数的格式如下: 类型 函数名(形式参数表) { 语句序列 } 定义函数,就是告诉编译器函数所做的工作。 ☆ 函数不能调用没有声明的函数。 函数的返回值是需要返回给主调函数处理的结果,由return语句给出。当 该函数没有返回值时,函数的类型为void,可不写return语句。 该函数的类型,即该 函数返回值的类型。 一个标识符,在命名时, 其中主函数的名称应取 编译器默认的名称main。 可以有0条、1条或多条语句。 当是0条语句时,该函数称作 空函数。 【 4.1.1 函数的定义】
(41.1函数的定义】 形参在该函数被调用时,由主调函数初始化。在函数没有被调用时, 形参只是一个符号。它标示着该函数将可以从主调函数那里获取什么数据。 在实际调用时,主调函数将把实际参数赋给形参。 每个函数都是一个功能独立的模块,绝对不允许在一个函数体内定义另 个函数。 例4-1函数的定义 double rectanglearea(double a, double b) double s; s=ab return s. 说明:用于计算一个长方形的面积。其 中a、b分别对应于长方形的长和宽
形参在该函数被调用时,由主调函数初始化。在函数没有被调用时, 形参只是一个符号。它标示着该函数将可以从主调函数那里获取什么数据。 在实际调用时,主调函数将把实际参数赋给形参。 每个函数都是一个功能独立的模块,绝对不允许在一个函数体内定义另一 个函数。 函数的定义 double rectanglearea(double a,double b) { double s; s=a*b; return s; } 说明:用于计算一个长方形的面积。其 中a、b分别对应于长方形的长和宽。 【 4.1.1 函数的定义】 例 4-1
(41.2函数的声明】 声明函数,一般采用声明函数原型 形式如下: 必须以分号结尾。 类型函数名(形式参数表X; 函数原型中的类型、函数名和形参表必须与定义该函数时完全一致,但函 数原型中可以不包含参数名,而只包含形参的类型 例如: double rectanglearea( double a, double b) double rectanglearea(double, double) 声明函数还有另外一种方法,即在其他函数调用之前定义函数。 女在函数体内声明的函数原型只对拥有这个函数体的函数有效。如 注果其他函数也需要调用它,必须另外声明函数。 (41.3函数的调用】 除主函数main由系统自动调用外,其他函数都由主函数直接或间接调用的
声明函数,一般采用声明函数原型。 形式如下: 类型 函数名(形式参数表); 函数原型中的类型、函数名和形参表必须与定义该函数时完全一致,但函 数原型中可以不包含参数名,而只包含形参的类型。 例如: double rectanglearea(double a,double b); double rectanglearea(double,double); 声明函数还有另外一种方法,即在其他函数调用之前定义函数。 在函数体内声明的函数原型只对拥有这个函数体的函数有效。如 注 果其他函数也需要调用它,必须另外声明函数。 【 4.1.3 函数的调用】 除主函数main由系统自动调用外,其他函数都由主函数直接或间接调用的。 必须以分号结尾。 【 4.1.2 函数的声明】
(41.3函数的调用】 函数的调用的一般形式如下: 函数名(实际参数表) 实际参数表中的实际参数又称实参,它是一个表达式,用来初始化被 调用函数的形参,因此,应与该函数定义中的形参表中的形参一一对应, 即个数相等且对应参数的数据类型相同 函数调用是一个表达式,其中的括号是函数调用运算符。表达式的值 就是被调用函数的返回值,类型是函数定义中指定的函数返回值的类型, 也即函数的类型 如果函数的返回类型为void,说明该函数没有返回值。该函数的调用表 达式尽能在基后 用作表达式语句。否则,该函数的调用表达式可作为 个子表达式,角作其他表达式的操作数。 函数调用 计算出每个实使用该值去初始化对应的形参,即用第1个实参初始化第 参表达式的值 个形参,第2个实参初始化第2个形参,…,依次类推
函数的调用的一般形式如下: 函数名(实际参数表) 如果函数的返回类型为void,说明该函数没有返回值。该函数的调用表 达式只能在其后加分号用作表达式语句。否则,该函数的调用表达式可作为 一个子表达式,用作其他表达式的操作数。 实际参数表中的实际参数又称实参,它是一个表达式,用来初始化被 调用函数的形参,因此,应与该函数定义中的形参表中的形参一一对应, 即个数相等且对应参数的数据类型相同。 函数调用是一个表达式,其中的括号是函数调用运算符。表达式的值 就是被调用函数的返回值,类型是函数定义中指定的函数返回值的类型, 也即函数的类型。 函数调用: 计算出每个实 参表达式的值 使用该值去初始化对应的形参,即用第1个实参初始化第 1个形参,第2个实参初始化第2个形参,…,依次类推。 【 4.1.3 函数的调用】
函数的返回值是通过返回语句 return来实现的。 return语句的一般格式如下: return表达式; 意义:计算出其中表达式的值,并将这个值返回给主调函数作为调用子函 数的结果值。同时结束该函数的执行,继续执行函数表达式后面的操作。 注对于没有返回值的函数, return语句可有可无。 没有 return语句:函数在被调用时,程序执行完函数体的最后 (情况分类) 条语句后,自动返回主调函数。 有 return语句:这时的 return语句应表示为: return; 个函数中允许出现多个 return语句,分别用于不同条件下的函数返回 例4-2函数的调用 ∥根据用户输入的长方形的长及宽计算出它的面积 # include≤ iostream. h>
意义:计算出其中表达式的值,并将这个值返回给主调函数作为调用子函 数的结果值。同时结束该函数的执行,继续执行函数表达式后面的操作。 函数的返回值是通过返回语句return来实现的。 return语句的一般格式如下: return 表达式; 情况分类 没有return语句:函数在被调用时,程序执行完函数体的最后 一条语句后,自动返回主调函数。 有return语句: 这时的return语句应表示为: return; 一个函数中允许出现多个return语句,分别用于不同条件下的函数返回。 函数的调用 //根据用户输入的长方形的长及宽计算出它的面积 #include 注 对于没有返回值的函数,return语句可有可无。 例 4-2
double rectanglearea (double a, double b); (续) void maino double length width cout>length>>width; cout<<"the area of the rectangle is"<<rectanglearea(length, width); cout<<endl; double rectanglearea(double a, double b) double s: s=a*b return s 说明:由两个函数组成,函数main接受用户的输入后,用输入值作 为实参调用函数 rectanglearea,子函数 rectanglearea计算出长方形的 面积,并将其值返回给函数mi,由函数mi显示出来
double rectanglearea(double a,double b); void main() { double length,width; cout>length>>width; cout<< ″the area of the rectangle is ″<<rectanglearea(length,width); cout<<endl; } double rectanglearea(double a,double b) { double s; s=a*b; return s; } 说明:由两个函数组成,函数main接受用户的输入后,用输入值作 为实参调用函数rectanglearea,子函数rectanglearea计算出长方形的 面积,并将其值返回给函数main,由函数main显示出来。 (续)
(续) Please input the length and width of the rectangle: 号提示用户输入数据,假设用户输入 the area of the rectangle is 200 在一个函数带有多个参数时,C+语言并没有明确规定调用这个函数时对实 参的求值顺序,而是让编译器根据对代码进行优化的需要自行决定对实参的 求值顺序。它的不确定性在某些情况下会带来二义性问题。 例4-3实参求值顺序不同所带来的二义性问题 # include≤ iostream. h> int area(int a, int b); void main()
在一个函数带有多个参数时,C++语言并没有明确规定调用这个函数时对实 参的求值顺序,而是让编译器根据对代码进行优化的需要自行决定对实参的 求值顺序。它的不确定性在某些情况下会带来二义性问题。 Please input the length and width of the rectangle: the area of the rectangle is 200 提示用户输入数据,假设用户输入: 20 10 例 4-3 实参求值顺序不同所带来的二义性问题 #include int area(int a,int b); void main( ) { (续)
例4-3(实参求值顺序不同所带来的二义性问题 int a(20); int s s=area(-a2a×2); cout<<s<<endl; 说明:调用函数area时,实参求值顺序 先计算a*2,再计算 int area (int a, int b) 有两种可能 return(a*b); 先计算-a,再计算 赋给形参b的值有可能是40,也有可能是38 改变调用函数表达式中实参的表示形式,避免有可能带来二义性的写法
改变调用函数表达式中实参的表示形式,避免有可能带来二义性的写法。 说明:调用函数area时,实参求值顺序 有两种可能 先计算a*2,再计算--a 先计算--a ,再计算a*2 赋给形参b的值有可能是40,也有可能是38。 int a(20); int s; s=area(--a,a*2); cout<<s<<endl; } int area(int a,int b) { return (a*b); } 例 4-3 实参求值顺序不同所带来的二义性问题