C++ 第3章 函数和作用域(精品)

上传人:无*** 文档编号:245132793 上传时间:2024-10-07 格式:PPT 页数:38 大小:181.50KB
返回 下载 相关 举报
C++ 第3章 函数和作用域(精品)_第1页
第1页 / 共38页
C++ 第3章 函数和作用域(精品)_第2页
第2页 / 共38页
C++ 第3章 函数和作用域(精品)_第3页
第3页 / 共38页
点击查看更多>>
资源描述
,*,第三章,函数和作用域,第3章,函数和作用域,3.1,函数的定义和说明,3.2,函数的调用,3.3,函数的参数传递,3.4,内联函数,3.5,带默认参数的函数,3.6,函数重载,3.7,使用,C+,系统函数,3.8,作用域,【,3.1,函数的定义和说明,】,函数,是一个能完成某一独立功能的子程序,也就是程序模块。每个,C+,程序至少包含一个函数,即,main,函数(主函数),。在面向过程的程序设计中,一个较为复杂的程序一般通过模块化,分解成主模块与若干子模块的组合,即一个主函数与若干子函数。程序是以函数为单位,由一个或多个函数组成的。,在面向对象的程序设计中,一个,C+,程序是由类的实例(对象)构成。函数主要用于定义对象的操作接口。,本章介绍有关函数的一些基本知识,如:函数的定义及调用等。这些知识虽然大部分是建立在面向过程的程序设计方法的基础上,但它们也是我们学习面向对象程序设计的基础。,在面向过程的程序设计中,一个,C+,程序由一个或多个函数组成。当程序开始运行时,系统自动调用主函数。主函数可以调用子函数,子函数还可以调用其他子函数。,调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。,【,3.1.1 函数的定义,】,在,C+,程序中,使用函数前首先需要声明函数,然后定义函数。,声明函数,,就是告诉编译器函数的名称、类型和形式参数,。,定义函数,,就是告诉编译器函数所做的工作,。,函数不能调用没有声明的函数。,在,C+,程序中,定义一个函数的格式如下:,类型 函数名(形式参数表),语句序列,该函数的类型,即该函数返回值的类型。,一个标识符,在命名时,其中主函数的名称应取编译器默认的名称,main,。,可以有,0,条、,1,条或多条语句。当是,0,条语句时,该函数称作空函数。,函数的返回值是需要返回给主调函数处理的结果,由,return,语句给出。当该函数没有返回值时,函数的类型为,void,,可不写,return,语句。,每个函数,都有类型,,如果没有明确指定,则类型为,int,。,形式参数表由,0,个、,1,个或多个参数组成,内容如下:,类型,1,形式参数名,1,,类型,2,形式参数名,2,,,类型,n,形式参数名,n,说明了对应形式参数的数据类型。,是一个标识符。,形式参数,又称形参,将函数需要处理的数据、影响函数功能的因素和函数处理的结果作为形参,实现主调函数与被调函数之间的联系。,没有形参,的函数,可以在形参表的位置填上,void,或,保留空白,,但形参表两边的,圆括号,不可省略,。,类型、函数名、圆括号和形参表组成了,函数头,。用花括号括起来的语句序列则组成了,函数体,。,形参在该函数被调用时,由主调函数,初始化,。在函数,没有被调用,时,形参只是一个符号。它,标示着,该函数将可以从主调函数那里获取什么数据。在,实际调用,时,主调函数将,把实际参数赋给形参,。,每个函数都是一个功能独立的模块,绝对不允许在一个函数体内定义另一个函数。,函数的定义,/,用于计算一个长方形的面积。,/其中,a、b,分别对应于长方形的长和宽。,double,rectanglearea,(double a,double b),double s;,s=a*b;,return s;,例 3.1,声明函数,一般采用声明函数原型。形式如下:,类型 函数名(形式参数表);,必须以分号结尾。,函数原型中的,类型、函数名和形参表,必须与定义该函数时,完全一致,,但函数原型中可以,不包含,参数名,而,只包含,形参的类型。,例如:,double,rectanglearea,(double a,double b);,double,rectanglearea,(double,double);,声明函数还有,另外一种方法,,即在其他函数调用之前定义函数。,在函数体内声明的函数原型只对拥有这个函数体的函数,有效,。如果其他函数也需要调用它,必须,另外声明函数,。,注,【,3.2,函数的调用,】,除,主函数,main,由系统自动调用外,其他函数都由主函数直接或间接调用的。,【,3.1.2 函数的声明,】,函数的调用的一般形式如下:,函数名(实际参数表),实际参数表中的实际参数又称,实参,,它是一个表达式,用来初始化被调用函数的形参,因此,应与该函数定义中的形参表中的形参,一一对应,,即个数相等且对应参数的数据类型相同。,函数调用,是一个表达式,其中的括号是函数调用运算符。,表达式的值,就是被调用函数的返回值,,类型,是函数定义中指定的函数返回值的类型,也即,函数的类型,。,如果函数的返回类型为,void,,,说明该函数,没有返回值,。该函数的调用表达式只能在其后,加分号,用作表达式语句。否则,该函数的调用表达式可作为,一个子表达式,,用作其他表达式的操作数。,函数调用,:,计算出每个实参表达式的值,使用该值去初始化对应的形参,即用第,1,个实参初始化第,1,个形参,第,2,个实参初始化第,2,个形参,,,依次类推。,函数的返回值是通过返回语句,return,来实现的。,return,语句的一般格式如下:,return,表达式;,意义,:计算出其中表达式的值,并将这个值返回给主调函数作为调用子函数的结果值。同时结束该函数的执行,继续执行函数表达式后面的操作。,对于,没有返回值的函数,,,return,语句可有可无。,注,情况分类,没有,return,语句:,函数在被调用时,程序执行完函数体的最后 一条语句后,自动返回主调函数。,有,return,语句:,这时的,return,语句应表示为:,return;,一个函数中允许出现,多个,return,语句,,分别用于不同条件下的函数返回。,函数的调用,/,根据用户输入的长方形的长及宽计算出它的面积,#,include,例 3.2,double,rectanglearea,(double a,double b);/,函数声明,void main(),double length,width;,cout,lengthwidth;,cout,the area of the rectangle is,rectanglearea,(length,width);,/length,和,width,是实参,分别将各自的值赋给形参,a,和,b,cout,endl,;,double,rectanglearea,(double a,double b)/a,和,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,提示用户输入数据,假设用户输入,:,20 10,在一个函数带有多个参数时,,C+,语言并没有明确规定调用这个函数时对实参的求值顺序,而是让编译器根据对代码进行优化的需要自行决定对实参的求值顺序。它的不确定性在某些情况下会带来,二义性问题,。,例 3.3,实参求值顺序不同所带来的二义性问题,#,include,int,area(,int,a,int,b);,void main(void),int,a=20;,int,s;,s=area(+a,a*2);,cout,s,endl,;,int,area(,int,a,int,b),return(a*b);,说明:调用函数,area,时,实参求值顺序,有两种可能,先计算,a*2,,再计算,-,a,先计算,-,a,,再计算,a*2,赋给形参,b,的值有可能是,40,,也有可能是,38,。,改变,调用函数表达式中实参的表示形式,避免有可能带来,二义性,的写法。,改写成:避免因实参求值顺序不同所带来的二义性问题,#,include,int,area(,int,a,int,b);,void main(),int,a=20;,int,s;,+a;,s=area(a,a*2);,cout,s,endl,;,int,area(,int,a,int,b),return(a*b);,例 3.4,main(),statement;,fun1();,statement;,fun1(),statement;,fun2();,statement;,return;,fun2(),statement;,return;,保存返回地址及当前现场,恢复函数,main,的现场,取得返回地址,保存返回地址及当前现场,恢复函数,fun1,的现场,取得返回地址,图 函数调用的执行过程,【,3.3 函数的参数传递,】,函数调用时,如果被调用函数带有形参,系统需要首先给它的形参分配内存空间,并用调用表达式中的实参初始化形参。,函数调用时的参数传递,指的就是实参与形参结合过程。,实参与形参结合方法,传值调用,:,传址调用,引用传递,简称值传递。,使用值调用,时,系统首先为形参分配内存空间,并将实参的值按位置,一一对应,赋给形参。在被调用函数中形参值的任何改变都不会影响到实参,。,例 3.5,值传递,#,include,void swap(,int,a,int,b);,void main(),int,x=3,y=4;,cout,In main function,endl,;,cout,Before swap:;,cout,x=x t y=y,endl,;,swap(x,y);,cout,In main function:,endl,;,cout,After swap:;,cout,x=x t y=y,endl,;,void swap(,int,a,int,b),int,temp;,cout,In Swap function:,endl,;,cout,Before swap:;,cout,a=at b=b,endl,;,temp=a;,a=b;,b=temp;,cout,After swap:;,cout,a=a t b=b,endl,;,说明:在函数,swap,中两个形参的值做了交换,但与它们对应的实参的值并未改变。,In main function:,Before swap:x=3 y=4,In swap function:,Before swap:a=3 b=4,After swap:a=4 b=3,In main function:,After swap:x=3 y=4,【,3.4 内联函数,】,使用内联函数,,编译器在编译时,并不生成真正的函数,,而是将程序中出现的每一个内联函数调用表达式,直接,用该内联函数的函数体,替换,。,内联函数应该定义在前,调用在后,定义时只需在前面加上关键字,inline,。,形式如下:,inline,类型 函数名(形参表),./,函数体,说明:仅在声明函数原型时加上关键字,inline,,并不能达到内联效果。,例 3.6,内联函数的使用,/计算正方形的面积,#,include,inline double area(double x);/inline,函数声明,void main(),double x;,cout,x;,x=area(x);/,调用函数,cout,endl,the area of a square is:t x;,cout,endl,;,/end of main,double area(double x)/,此处无,inline,,视为,inline,return x*x;,Please input the length of a,spuare,:,the area of a,spuare,is:56.25,提示用户输入正方形的边长。,假设输入:7.,5,内联函数的使用会增加程序的代码量。,注,内联函数一般来说仅适用于只有一、两条语句的小函数。,【,3.5
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!