欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Visual C++第04章app.ppt

    • 资源ID:67325738       资源大小:861KB        全文页数:94页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Visual C++第04章app.ppt

    在结构化程序设计中,函数是将任务进行模块划分的基在结构化程序设计中,函数是将任务进行模块划分的基本单位。本单位。第四章第四章 函数函数 在面向对象的程序设计中,对数据的操作总是封装在在面向对象的程序设计中,对数据的操作总是封装在函数中,一个函数描述一种操作。不要完全按模块思想讲。函数中,一个函数描述一种操作。不要完全按模块思想讲。也是让学生处于面向对象程序设计的氛围中。这样第也是让学生处于面向对象程序设计的氛围中。这样第5 5章的章的教学会顺利一些。教学会顺利一些。要掌握函数的使用,必须理解函数调用时的内部实现机要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量生命期和作用域。制,以及与此相关的内存分配机制、变量生命期和作用域。本章还将介绍关于函数重载的概念,介绍递归算法、本章还将介绍关于函数重载的概念,介绍递归算法、内联函数、默认参数函数以及多文件组织、编译预处理、内联函数、默认参数函数以及多文件组织、编译预处理、工程文件的概念和运行库函数。工程文件的概念和运行库函数。第四章第四章 函数函数 41函数的定义与调用函数的定义与调用45作用域与存储类型作用域与存储类型 44函数调用机制函数调用机制 43全局变量和局部变量全局变量和局部变量 42函数的参数传递函数的参数传递,返回值及函数原型说明返回值及函数原型说明 410编译预处理编译预处理49头文件头文件与多文件结构与多文件结构48C+的系统库函数的系统库函数47函数的一些高级议题函数的一些高级议题 46函数的递归调用函数的递归调用 4.1 函数的定义与调用函数的定义与调用4.1.1 函数概述函数概述4.1.2 函数的定义函数的定义4.1.3 函数的调用函数的调用 4.1.1 函数概述函数概述函数是函数是C+C+程序的基本组成模块。程序的基本组成模块。通通过过函函数数,可可以以把把一一个个复复杂杂任任务务分分解解成成为为若若干干个个易易于于解解决决的的小小任任务务。充充分分体体现现结结构构化化程程序序设设计计由由粗粗到精,逐步细化的设计思想。到精,逐步细化的设计思想。组组 成成 C+C+程程 序序 的的 若若 干干 函函 数数 中中,有有 一一 个个 称称 为为main()main()(WinmainWinmain()())函函数数,是是程程序序执执行行的的入入口口,它它可可以以调调用用其其他他函函数数。而而其其他他一一般般函函数数既既可可以以调调用用也也可可以被调用。函数之间的调用关系见下图:以被调用。函数之间的调用关系见下图:4.1.1 函数概述函数概述main()fun2()fun1()fun3()fun1_1()fun2_1()fun2_2()图图4.1 4.1 函数调用层次关系函数调用层次关系4.1.1 函数概述函数概述函数函数按是否带有参数,分为按是否带有参数,分为:无参函数无参函数和和有参函数有参函数4.1.1结束结束 函数按其是否系统预定义分为两类:函数按其是否系统预定义分为两类:一类是编译系统预定义的,称为一类是编译系统预定义的,称为库函数库函数或或标准函数标准函数,如一些常用的数学计算函数、字符串处理函数、图如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。这些形处理函数、标准输入输出函数等。这些库函数都库函数都按功能分类,集中说明在不同的头文件中按功能分类,集中说明在不同的头文件中。用户只。用户只需在自己的程序中包含某个头文件,就可直接使用需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。该文件中定义的函数。另一类是用户另一类是用户自定义函数自定义函数,用户可以根据需要将某,用户可以根据需要将某个具有相对独立功能的程序定义为函数。个具有相对独立功能的程序定义为函数。4.1.2 函数的定义函数的定义1.无参函数无参函数2.有参函数有参函数1 无参函数无参函数 定义格式为:定义格式为:数据类型数据类型函数名函数名(voidvoid)函数体函数体 例例:下面函数的功能是打印一个表头下面函数的功能是打印一个表头voidTableHead()cout*endl;cout*example*endl;cout*=b?a:b);定义函数时可能会涉及若干个变量,究竟哪些变量应当作定义函数时可能会涉及若干个变量,究竟哪些变量应当作为函数的参数?哪些应当定义在函数体内?这有一个原则:作为函数的参数?哪些应当定义在函数体内?这有一个原则:作为一个相对独立的模块,为一个相对独立的模块,函数在使用时完全可以被看成函数在使用时完全可以被看成 “黑黑匣子匣子”,除了输入输出外,其他部分可不必关心,除了输入输出外,其他部分可不必关心。从函数的定。从函数的定义看出,函数头正是用来反映函数的功能和使用接口,它所定义看出,函数头正是用来反映函数的功能和使用接口,它所定义的是义的是“做什么做什么”,在这部分必须明确,在这部分必须明确“黑匣子黑匣子”的输入输出的输入输出部分,部分,输出就是函数的返回值,输入就是参数输出就是函数的返回值,输入就是参数。因此,只有那。因此,只有那些功能上起自变量作用的变量才必须作为参数定义在参数表中;些功能上起自变量作用的变量才必须作为参数定义在参数表中;函数体中具体描述函数体中具体描述“如何做如何做”,因此除参数之外的为实现算法,因此除参数之外的为实现算法所需用的变量应当定义在函数体内。所需用的变量应当定义在函数体内。C+C+中不允许函数的嵌套定义,即在一个函数中定义另一中不允许函数的嵌套定义,即在一个函数中定义另一个函数。个函数。提示提示4.1.3 函数的调用函数的调用在在C+C+中中,除除了了主主函函数数外外,其其他他任任何何函函数数都都不不能能单单独独作作为为程程序序运运行行。任任何何函函数数功功能能的的实实现现都都是是通通过过被被主主函函数数直直接接或或间间接接调调用进行的。所谓函数调用,就是使程序转去执行函数体。用进行的。所谓函数调用,就是使程序转去执行函数体。无参函数的调用格式为:无参函数的调用格式为:函数名函数名()()有参函数的调用格式为:有参函数的调用格式为:函数名函数名(实际参数表实际参数表)其其中中实实际际参参数数简简称称实实参参,用用来来将将实实际际参参数数的的值值传传递递给给形形参参,因此可以是常量、具有值的变量或表达式。因此可以是常量、具有值的变量或表达式。4.1.3 函数的调用函数的调用main()函数函数调用调用max(2.5,4.7)函数函数max(2.5,4.7)return4.7 主程序后主程序后续语句续语句【例例41】输输入入两两个个实实数数,输输出出其其中中较较大大的的数数。其其中中求求两两个个实实数中的较大数用函数完成。数中的较大数用函数完成。程序如下程序如下:#includefloat max(float x,float y)return(x=y?x:y);void main()float x,y;cout输入两个实数:输入两个实数:xy;coutx和和y中较大数为中较大数为max(x,y)endl;4.2 函数的参数传递、返回值及函数的参数传递、返回值及函数原型说明函数原型说明 421 函数的参数传递及传值调用函数的参数传递及传值调用 423 函数原型说明函数原型说明422 函数返回值函数返回值 函数调用首先要进行参数传递,参数传递的方向是由实参函数调用首先要进行参数传递,参数传递的方向是由实参传递给形参。传递过程是,传递给形参。传递过程是,先计算实参表达式的值,再将先计算实参表达式的值,再将该值传递给对应的形参变量该值传递给对应的形参变量。一般情况下,。一般情况下,实参和形参的实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼容)(赋值兼容),即实参的类型可以转化为形参类型。而对即实参的类型可以转化为形参类型。而对应参数的参数名则不要求相同。应参数的参数名则不要求相同。4.2.1 函数的参数传递及传值调用函数的参数传递及传值调用 按照参数形式的不同,按照参数形式的不同,C+有两种调用方式:有两种调用方式:传值调用传值调用和和引用调用引用调用。顾名思义,传值调用传递的是实参的值,。顾名思义,传值调用传递的是实参的值,本章主要介绍传值调用。关于引用调用,将在第五章类本章主要介绍传值调用。关于引用调用,将在第五章类与对象中介绍。与对象中介绍。4.2.1 函数的参数传递及传值调用函数的参数传递及传值调用 调用调用power(4.6,3)函数函数power(4.6,3)return97.336 主程序后续语主程序后续语句句n=3x=4.6c=a【例【例42】说明实参和形参对应关系的示例。说明实参和形参对应关系的示例。#include#includefloat power(float x,int n)/求求x x的的n n次幂次幂float pow=1;while(n-)pow*=x;return pow;void main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;4.2.1 函数的参数传递及传值调用函数的参数传递及传值调用 调用调用power(a,3)函数函数power(a,3)return912673 主程序后续语主程序后续语句句n=3x=4.6c=a【例例42】说明实参和形参对应关系的示例。说明实参和形参对应关系的示例。#include#includefloat power(float x,int n)/求求x x的的n n次幂次幂float pow=1;while(n-)pow*=x;return pow;void main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;4.2.1 函数的参数传递及传值调用函数的参数传递及传值调用 调用调用power(3,4.6)函数函数power(3,4.6)return81主程序后续语主程序后续语句句n=3x=4.6c=a【例例42】说明实参和形参对应关系的示例。说明实参和形参对应关系的示例。#include#includefloat power(float x,int n)/求求x x的的n n次幂次幂float pow=1;while(n-)pow*=x;return pow;void main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;4.2.2 函数返回值函数返回值return语句的一般格式为:语句的一般格式为:return表达式;表达式;函数的计算结果通过该语句传递回主调函数。函数的计算结果通过该语句传递回主调函数。【例【例43】设计函数,根据三角形的三边长求面积。如设计函数,根据三角形的三边长求面积。如果不能构成三角形,给出提示信息。果不能构成三角形,给出提示信息。分析:函数为计算三角形面积,一般三角形返回面积值,分析:函数为计算三角形面积,一般三角形返回面积值,若不能构成三角形则返回若不能构成三角形则返回-1。设计一个主函数完成函数测。设计一个主函数完成函数测试。根据返回值情况输出相应结果。试。根据返回值情况输出相应结果。程序见下页:程序见下页:#include#includefloatTriangleArea(floata,floatb,floatc)if(a+b=c)|(a+c=b)|(b+c=a)return-1;floats;s=(a+b+c)/2;returnsqrt(s*(s-a)*(s-b)*(s-c);voidmain()floata,b,c,area;cout输入三角形三边输入三角形三边a,b,c:abc;area=TriangleArea(a,b,c);if(area=-1)cout(a,b,c)不能构成三角形!不能构成三角形!endl;else cout三角形三角形(a,b,c)面积为:面积为:areaendl;4.2.2 函数返回值函数返回值函函数数可可以以有有返返回回值值,也也可可以以没没有有返返回回值值。对对于于没没有有返返回回值值的的函函数数,功功能能只只是是完完成成一一定定操操作作,应应将将返返回回值值类类型型定定义义为为void,函函数数体体内内可可以以没没有有return语语句句,当当需需要要在在程程序序指指定定位位置置退退出出时时,可可以以在该处放置一个:在该处放置一个:return;4.2.2结束结束4.2.3 函数原型说明函数原型说明 函函数数原原型型是是一一条条以以分分号号结结束束的的语语句句,实实际际上上就是所定义函数的函数头,形如:就是所定义函数的函数头,形如:函数返回值类型函数返回值类型函数名函数名(形参表形参表)语语法法上上对对程程序序文文件件中中函函数数的的排排列列次次序序是是没没有有固固定定要要求求的的,只只要要满满足足先先定定义义后后使使用用即即可可。但但从从结结构构化化程程序序设设计计的的角角度度,通通常常是是先先调调用用后后定定义义。使使用用函函数数原原型型,则则既既符符合合由由粗粗到到精精的的思维方式,又满足了语法要求。思维方式,又满足了语法要求。其中形参表可以逐个列出每个参数的类型和参数名,其中形参表可以逐个列出每个参数的类型和参数名,也可以列出每个形参的类型,也可以列出每个形参的类型,参数名可省略参数名可省略,各形参之间,各形参之间以逗号分隔。函数原型和所定义的函数必须在返回值类型、以逗号分隔。函数原型和所定义的函数必须在返回值类型、函数名、形参个数和类型及函数名、形参个数和类型及次序次序等方面完全对应一致,否等方面完全对应一致,否则将导致编译错误。则将导致编译错误。下下面面是是一一个个使使用用结结构构化化程程序序设设计计思思想想开开发发的的企企业业管管理理报表程序的框架。它使用了函数原型说明。报表程序的框架。它使用了函数原型说明。#includevoidmenu_print();voidaccount_report();voidengineering_report();voidmarketing_report();voidmain()intchoice;domenu_print();cinchoice;while(choice=4);switch(choice)case1:account_report();break;case2:engineering_report();break;case3:marketing_report();break;voidmenu_print()cout”系统功能:系统功能:”endl;cout”1 财务报表财务报表”endl;cout”2 工程报表工程报表”endl;cout”3 市场报表市场报表”endl;cout”选择业务序号:选择业务序号:”;voidaccount_report()/生成财务报表生成财务报表voidengineering_report()/生成工程报表生成工程报表voidmarketing_report()/生成市场报表;生成市场报表;4.2.3 函数原型说明函数原型说明【例例44】输输出出所所有有满满足足下下列列条条件件的的正正整整数数m:10m1000且且m、m2、m3均为回文数。均为回文数。分析:分析:回文指左右对称的序列。如回文指左右对称的序列。如121、353等就是回等就是回文数。判断整数是否回文数用函数实现,其思想是将文数。判断整数是否回文数用函数实现,其思想是将该数各位拆开后反向组成新的整数,如果该整数与原该数各位拆开后反向组成新的整数,如果该整数与原数相等则为回文数。数相等则为回文数。程序如下:程序如下:#include#includeboolpalindrome(int);/函数原型函数原型voidmain()coutsetw(10)msetw(20)m*msetw(20)m*m*mendl;for(intm=11;m1000;m+)if(palindrome(m)&palindrome(m*m)&palindrome(m*m*m)coutsetw(10)msetw(20)m*msetw(20)m*m*m0);for(int j=0;ji;j+)n=n*10+digitj;return(n=m);4.2.3 函数原型说明函数原型说明mm*mm*m*m111211331101102011030301111123211367631运行结果:运行结果:4.3 全局变量和局部变量全局变量和局部变量4 43 31 1 变量的存储机制与变量的存储机制与变量的存储机制与变量的存储机制与C+C+的内存布局的内存布局的内存布局的内存布局 4 43 32 2 全局变量全局变量全局变量全局变量 4 43 33 3 局部变量局部变量局部变量局部变量 4.3.1 变量的存储机制与变量的存储机制与C+的内存布局的内存布局堆区堆区 (动态数据动态数据)栈区(函数局部数据)栈区(函数局部数据)(main()函数局部数据)函数局部数据)全局数据区全局数据区(全局、静态全局、静态)代码区(程序代码)代码区(程序代码)操操作作系系统统为为一一个个C+C+程程序序的的运运行行所所分分配配的的内内存存分分为为四四个个区区域域,如如图图4.34.3 程程序序在在内内存存中中的的区区域域所示:所示:(1)代码区()代码区(Codearea):):存放程序代码,存放程序代码,即程序中各个函数的代码块;即程序中各个函数的代码块;(2)全局数据区()全局数据区(Dataarea):):存放全局数存放全局数据和静态数据;分配该区时内存全部清零。据和静态数据;分配该区时内存全部清零。(3)栈区()栈区(Stackarea):):存放局部变量,如存放局部变量,如函数中的变量等;分配栈区时内存不处理。函数中的变量等;分配栈区时内存不处理。(4)堆区()堆区(Heaparea):):存放与指针相关的存放与指针相关的动态数据。分配堆区时内存不处理。参见第七章。动态数据。分配堆区时内存不处理。参见第七章。4.3.1 变量的存储机制与变量的存储机制与C+的内存布局的内存布局 4.3.2 全局变量全局变量 在在所有函数之外定义的变量称为所有函数之外定义的变量称为全局变量全局变量。全全局局变变量量在在编编译译时时建建立立在在全全局局数数据据区区,在在未未给给出初始化值时系统自动出初始化值时系统自动初始化为全初始化为全0。全全局局变变量量可可定定义义在在程程序序开开头头,也也可可定定义义在在中中间间位位置置,该该全全局局变变量量在在定定义义处处之之后后的的任任何何位位置置都都是是可可以访问的,称为可见的。以访问的,称为可见的。请看下例:请看下例:4.3.2 全局变量全局变量打印打印200调用调用func()函数函数func()200*2=400打印打印400n=100n=100*2=200【例【例4 45 5】多个函数使用全局变量的例子。多个函数使用全局变量的例子。#includeintn=100;voidfunc()n*=2;voidmain()n*=2;coutnendl;func();coutnendl;4.3.3 局部变量局部变量 定义在函数内或块内的变量称为定义在函数内或块内的变量称为局部变量局部变量。程序中使用的绝大多数变量都是局部变量。程序中使用的绝大多数变量都是局部变量。局局部部变变量量在在程程序序运运行行到到它它所所在在的的块块时时建建立立在在栈栈中中,该块执行完毕局部变量占有的空间即被释放。该块执行完毕局部变量占有的空间即被释放。局局部部变变量量在在定定义义时时可可加加修修饰饰词词auto,但但通通常常省省略略。局部变量在定义时若未初始化,其值为随机数。局部变量在定义时若未初始化,其值为随机数。4.3.3 局部变量局部变量 打印打印main()中的中的t=3.5调用调用fun()函数函数fun()打印打印fun()中的中的t=5打印打印main()中的中的t=3.5t=3.5t=5【例【例49】使用局部变量的例子。使用局部变量的例子。#includevoidfun()autointt=5;/fun()中的局部变量,中的局部变量,auto可省略可省略coutfun()中的中的t=tendl;voidmain()floatt=3.5;/main()函数中的局部变量函数中的局部变量coutmain()中中的的t=tendl;fun();coutmain()中中的的t=tendl;4.4 函数调用机制函数调用机制 局局部部变变量量占占用用的的内内存存是是在在程程序序执执行行过过程程中中“动动态态”地地建建立立和和释释放放的的。这这种种“动动态态”是是通通过过栈栈由由系系统统自自动动管管理理进进行行的的。当当任何一个函数调用发生时,系统都要作以下工作:任何一个函数调用发生时,系统都要作以下工作:(1)建立栈空间;)建立栈空间;(6)恢复现场:取主调函数运行状态及返回地址,释放栈空间;)恢复现场:取主调函数运行状态及返回地址,释放栈空间;(7)继续主调函数后续语句。)继续主调函数后续语句。(5)释放被调函数中局部变量占用的栈空间;)释放被调函数中局部变量占用的栈空间;(4)执行被调函数函数体;)执行被调函数函数体;(3)为被调函数中的局部变量分配空间,完成参数传递;)为被调函数中的局部变量分配空间,完成参数传递;(2)保护现场:主调函数运行状态和返回地址入栈;)保护现场:主调函数运行状态和返回地址入栈;4.4 函数调用机制函数调用机制 void fun1(int,int);void fun2(float);void main()int x=1;y=2;fun1(x,y);void fun1(int a,int b)float x=3;fun2(x);void fun2(float y)int x;x栈顶栈顶栈底栈底y3fun2()fun1()运行状态及返回地址运行状态及返回地址x3b2a1fun1()main()运行状态及返回地址运行状态及返回地址y2x1main()操作系统运行状态及返回地址操作系统运行状态及返回地址此图例说明此图例说明在程序执行过程中怎样通过栈在程序执行过程中怎样通过栈“动态动态”地建立和地建立和释放局部变量占用的内存的释放局部变量占用的内存的 4.5 作用域与存储类型作用域与存储类型4.5.1 作作用用域域4.5.2变量的存储类型变量的存储类型4.5.3外部存储类型与静态存储类型外部存储类型与静态存储类型 4.5.4生命期与可见性生命期与可见性 4.5.1 作用域作用域 1块作用域块作用域 3文件作用域文件作用域 2函数原型作用域函数原型作用域 作作用用域域指指标标识识符符能能够够被被使使用用的的范范围围。只只有有在在作作用用域内标识符才可以被访问(称为可见)。域内标识符才可以被访问(称为可见)。本本节节只只讨讨论论局局部部域域和和文文件件域域(全全局局域域),其其中中局局部部域域包包括括块块域域和和函函数数原原型型域域。任任何何标标识识符符作作用用域域的的起起始点均为始点均为标识符说明标识符说明处。处。下面分别介绍下面分别介绍:参参和和函函数数体体中中定定义义的的局局部部变变量量,作作用用域域都都在在该该函函数数内内,也称作也称作函数域函数域。1.块域块域块块指指一一对对大大括括号号括括起起来来的的程程序序段段。块块中中定定义义的的标标识符,作用域在块内。识符,作用域在块内。复合语句是一个块。复合语句是一个块。函数也是一个块。函数也是一个块。复合语句中定义的标识符,复合语句中定义的标识符,作用域仅在该复合语句中。作用域仅在该复合语句中。函数中定义的标识符,包括形函数中定义的标识符,包括形1.块域块域a=3 b=535a=3 b=5a=5 b=3【例【例47】输入两数,按从大到小的顺序保存,并输出结果。输入两数,按从大到小的顺序保存,并输出结果。结果结果栈栈t=3#includevoidmain()inta,b;/具有函数域具有函数域cout输入两整数:输入两整数:ab;cout“a=atb=b=a)intt;/具有块域具有块域t=a;a=b;b=t;/交换交换a,b的值的值couta=atb=bendl;【例【例48】设计函数完成两数交换,用主函数进行测试。设计函数完成两数交换,用主函数进行测试。#includevoidswap(int,int);voidmain()inta,b;/a,b作用域为作用域为main()cout输入两整数:输入两整数:ab;cout调用前:实参调用前:实参a=a,b=bendl;swap(a,b);/传值传值cout调用后:实参调用后:实参a=a,b=bendl;voidswap(inta,intb)/a,b作用域为作用域为swap()cout调用中调用中endl;cout交换前:形参交换前:形参a=a,b=bendl;intt;t=a;a=b;b=t;/交换交换swap()中的中的a,b的值的值cout交换后:形参交换后:形参a=a,b=bendl;1.块作用域块作用域由由VC+平台运行,结果如下:平台运行,结果如下:输入两整数:输入两整数:35调用前:实参调用前:实参a=3,b=5调用中调用中交换前:形参交换前:形参a=3,b=5交换后:形参交换后:形参a=5,b=3调用后:实参调用后:实参a=3,b=5交换失败交换失败局部变量具有局部作用域使得程序在不同块中可以局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见中可见,在其它地方不可见。1.块作用域块作用域 对于块中对于块中嵌套嵌套其它块的情况,如果嵌套块中有同其它块的情况,如果嵌套块中有同名局部变量,服从局部优先原则,即在内层块中名局部变量,服从局部优先原则,即在内层块中屏屏蔽蔽外层块中的同名变量,换句话说,内层块中局部外层块中的同名变量,换句话说,内层块中局部变量的作用域为内层块;外层块中局部变量的作用变量的作用域为内层块;外层块中局部变量的作用域为外层除去包含同名变量的内层块部分。域为外层除去包含同名变量的内层块部分。如果块内定义的局部变量与全局变量同名,块内仍如果块内定义的局部变量与全局变量同名,块内仍然局部变量优先,但与块作用域不同的是,在块内然局部变量优先,但与块作用域不同的是,在块内可以通过域运算符可以通过域运算符“:”访问同名的全局变量。访问同名的全局变量。全局全局n=100100 200 300内内i=500内内j=600内内n=500+600=11001100 500 600100200+300=500500 500 200 300外部外部 i=200外部外部 j=300【例【例49】显示同名变量可见性。显示同名变量可见性。intn=100;#includevoidmain()inti=200,j=300;coutntitjendl;/内部块内部块inti=500,j=600,n;n=i+j;coutntitjendl;/输出局部变量输出局部变量ncout:nendl;/输出全局变量输出全局变量nn=i+j;/修改全局变量修改全局变量coutntitjendl;2函数原型作用域函数原型作用域 函函数数原原型型不不是是定定义义函函数数,在在作作函函数数原原型型声声明明时时,其其中中的的形形参参作作用用域域只只在在原原型型声声明明中中,即即作作用用域域结结束束于于右右括括号号。正正是是由由于于形形参参不不能能被被程程序序的的其其他他地地方方引引用用,所所以以通通常常只只要要声声明形参个数和类型,明形参个数和类型,形参名可省略形参名可省略。3 文件作用域文件作用域 文文件件作作用用域域也也称称全全局局作作用用域域。定定义义在在所所有有函函数数之之外外的的标标识识符符,具具有有文文件件作作用用域域,作作用用域域为为从从定定义义处处到到整整个个源源文文件件结结束束。文文件件中中定定义义的的全全局局变变量量和和函函数数都都具具有有文文件作用域。件作用域。如如果果某某个个文文件件中中说说明明了了具具有有文文件件作作用用域域的的标标识识符符,该该文文件件又又被被另另一一个个文文件件包包含含,则则该该标标识识符符的的作作用用域域延延伸伸到到新新的的文文件件中中。如如cincin和和coutcout是是在在头头文文件件iostream.hiostream.h中中说说明明的的具具有有文文件件作作用用域域的的标标识识符符,它它们们的的作作用用域域也也延延伸伸到嵌入到嵌入iostream.hiostream.h的文件中。的文件中。存存储储类类型型决决定定了了变变量量的的生生命命期期,变变量量生生命命期期指指从从获得空间到空间释放之间的时期。获得空间到空间释放之间的时期。4.5.2 变量的存储类型变量的存储类型 存存储储类类型型的的说说明明符符有有四四个个:auto,register,static和和extern。前前两两者者称称为为自自动动类类型型,后后两两者者分分别别为为静静态态和和外外部类型。部类型。本本节节重重点点掌掌握握static和和extern这这两两种种类类型型的的使使用用和和区区别别。具具体体说说,区区分分局局部部变变量量和和静静态态局局部部变变量量,全全局局变量和静态全局变量变量和静态全局变量。auto:前前面面提提到到的的局局部部变变量量都都是是自自动动类类型型。其其空空间间分分配配于于块块始始,空空间间释释放放于于块块终终,且且由由系系统统自自动动进进行行。自自动动变变量量保保存存在在栈栈中中,且且是是在在程程序序运运行行过过程程中中获获得得和和释放空间,未初始化时值为随机数。释放空间,未初始化时值为随机数。4.5.2 变量的存储类型变量的存储类型 register:为为提提高高程程序序运运行行效效率率,可可以以将将某某些些变变量量保保存存在在寄存器中,即说明为寄存器变量,但不提倡使用。寄存器中,即说明为寄存器变量,但不提倡使用。static:静静态态变变量量。根根据据被被修修饰饰变变量量的的位位置置不不同同,分分为为局局部部(内内部部)静静态态变变量量和和全全局局(外外部部)静静态态变变量量。所所有有静静态态变变量量均均存存放放在在全全局局数数据据区区,编编译译时时获获得得存存储储空间,未初始化时自动全空间,未初始化时自动全0 0,且只初始化一次。,且只初始化一次。局局部部静静态态变变量量的的作作用用域域为为块块域域,但但生生命命期期为为整整个个文文件件。即即当当块块结结束束时时,局局部部静静态态变变量量空空间间仍仍然然保保持持,直直到到整整个个程程序序文文件件结结束束时时该该局局部部静静态态变变量量空空间间才才释释放放,生命期结束。生命期结束。局部静态变量局部静态变量【例例410】自自动动变变量量与与局局部部静静态态变变量量的的区区别别。(演演示)示)#includest()staticintt=100;/局部静态变量局部静态变量t+;returnt;at()intt=100;/自动变量自动变量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;4.5.2 变量的存储类型变量的存储类型 i=0t=10012 34 51011011011011014.5.2 变量的存储类型变量的存储类型 i=0t=1001 21013 4 5102103104105#includest()staticintt=100;/局部静态变量局部静态变量t+;returnt;at()intt=100;/自动变量自动变量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;全局静态变量全局静态变量全全局局静静态态变变量量是是指指用用static修修饰饰的的全全局局变量。有关内容在下节静态存储类型中介绍。变量。有关内容在下节静态存储类型中介绍。4.5.3 外部存储类型与静态存储类型外部存储类型与静态存储类型1.外部存储类型外部存储类型2.静态存储类型静态存储类型一个一个C+C+程序可以由多个源程序文件组成,编译系统程序可以由多个源程序文件组成,编译系统将这若干个文件连接在一起,产生可执行程序。外部将这若干个文件连接在一起,产生可执行程序。外部存储类型和静态存储类型确定了变量和函数在多文件存储类型和静态存储类型确定了变量和函数在多文件程序中的联络关系。程序中的联络关系。1 外部存储类型外部存储类型 外外部部存存储储类类型型包包括括外外部部变变量量和和外外部部函函数数。在在由由多多个个源源程程序序文文件件组组成成的的程程序序中中,如如果果一一个个文文件件要要使使用用另另一一个个文文件件中中定定义义的的全全局局变变量量或或函函数数,这这些些源源程程序序文文件件之之间间通通过过外外部部类类型型的变量和函数进行沟通。的变量和函数进行沟通。在一个文件中定义的全局变量和函数都缺省为外部的,即在一个文件中定义的全局变量和函数都缺省为外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果其作用域可以延伸到程序的其他文件中。但其他文件如果要使用这个文件中定义的全局变量和函数,必须在使用前要使用这个文件中定义的全局变量和函数,必须在使用前用用“externextern”作外部声明,外部声明通常放在文件的开头。作外部声明,外部声明通常放在文件的开头。变量定义时编译器为其分配存储空间,而变量声明指明该变量定义时编译器为其分配存储空间,而变量声明指明该全局变量已在其他地方说明过,编译系统不再分配存储空全局变量已在其他地方说明过,编译系统不再分配存储空间,直接使用变量定义时所分配的空间。间,直接使用变量定义时所分配的空间。函数声明缺省为外部的,因此修饰词函数声明缺省为外部的,因此修饰词externextern通常省略。通常省略。1 外部存储类型外部存储类型【例【例4.11】外部存储类型的例子。假定程序包含两个源程序文件外部存储类型的例子。假定程序包含两个源程序文件Ex4_11_1.cpp和和Ex4_11_2.cpp,程序结构如下:程序结构如下:/*Ex4_11_1.cpp,由由main()组成组成*/#includevoidfun2();/外部函数声明,等价于外部函数声明,等价于externvoidfun2();intn;/全局变量定义全局变量定义voidmain()n=1;fun2();/fun2()定义在文件定义在文件Ex4_11_2.cpp中中coutn=nendl;/*Ex4_11_2.cpp,由由fun2()组成组成*/externintn;/外部变量声明,外部变量声明,n定义在文件定义在文件Ex4_11_1.cpp中中voidfun2()/fun2()被文件被文件Ex4_11_1.cpp中的函数调用中的函数调用n=3;运行结果:运行结果:n=32 静态存储类型静态存储类型 静态存储类型包括静态全局变量和静态函数。在定义全局静态存储类型包括静态全局变量和静态函数。在定义全局变量或函数时加说明符变量或函数时加说明符staticstatic,就成为静态变量或静态函就成为静态变量或静态函数。静态存储类型的作用域与外部存储类型相反,一旦定数。静态存储类型的作用域与外部存储类型相反,一旦定义为静态存储类型,就限制该变量或函数只能在定

    注意事项

    本文(Visual C++第04章app.ppt)为本站会员(s****8)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开