




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级语言程序设计
§4过程抽象一函数
高级语言程序设计・2005春季
过程抽象
本章的内容结构和阅读要点
-函数
■函数(§4.2)
■变量的局部性(§4.3)
■递归函数(§4.4)
■函数名重载(§4.5)
■内联函数(§4.6)
■条件编译(§4.8)
2
高级语言程序设计・2005春季
过程抽象
-函数
§4.3变量的局部性
3
高级语言程序设计・2005春季
变量的局
全局变量
部性
全局变量与■全局变量是指定义在函数外部的变量,它们能被所
局部变量有函数使用。
变量的存储
分配■全局变量可以定义在函数外的任何地方。如果在使
C++程序的用一个全局变量时未见到它的定义,则在使用前要
多模块结构对该全局变量进行声明。
标识符的作
用域#incIude<iostream>
usingnamespacestd;voidf()
名空间intx(0);//全局变量{externintx;//全局变量声明
voidf(){x++;}
voidg(){x++;}
X=o
intmain()nt
{f0;g0;x++;
cout«x«endI;
return0;
4
高级语言程序设计・2005春季
变量的局
局部变量
部性
全局变量与局部变量是指在复合语句中定义的变量,它们只能
局部变量在定义它们的复合语句(包括内层复合语句)中使
变量的存储
分配用。
C++程序的函数体中定义的变量只能在定义它们的函数体内使
多模块结构
用。void千()
标识符的作{inty;//局部变量
用域y++;//正确
x++;//错误
名空间
)
voidmain()
{intx;
x++;//正确
y++;//错误
while(){x++;//正确
5
高级语言程序设计・2005春季
变量的局
局部变量
部性
全局变量与局部变量的定义可以放在复合语句的任何位置,但
局部变量是在复合语句中局部变量定义之前不能使用它们。
变量的存储
分配函数的形式参数也可以看成是局部变量,它们只能
C++程序的在相应的函数中使用。
多模块结构
标识符的作voidmain()
用域{……
x++;//错误
名空间
intx;
while(){x++;//正确
}
)
6
高级语言程序设计・2005春季
变量的局
变量的存储分配(生存期)
部性
全局变量与■通常把程序运行时一个变量占有内存空间的时间段
局部变量称为该变量的生存期。
变量的存储
分配■C++把变量的生存期分为静态、自动和动态三种:
C++程序的♦具有静态生存期的变量,它们的内存空间从程序开始执
多模块结构行时就进行分配,直到程序结束时才收回它们的空间。
标识符的作(全局变量具有静态生存期)
用域
♦具有自动生存期的变量,它们的内存空间在程序执行到
名空间
定义它们的复合语句(包括函数体)时才分配;当定义
它们的复合语句执行结束时,它们的空间将被收回。(
局部变量和函数参数一般具有自动生存期)
♦具有动态生存期的变量,其内存空间用new操作分配、用
delete操作收回。(动态变量具有动态生存期)
7
高级语言程序设计・2005春季
变量的局
存储分配(生存期)
部性
全局变量与在定义局部变量时,可以为它们加上存储类修饰符
局部变量来指出它们的生存期。
变量的存储
分配♦auto:自动存储类,局部变量的默认存储类,具有自动
生存期。
C++程序的
多模块结构♦static:静态存储类,具有静态生存期。
标识符的作♦register:寄存器存储类(建议编译程序将局部变量的空
用域
间分配在CPU的寄存器中),具有自动生存期。
名空间
static存储类的局部变量的作用是:它能在函数调
用时获得上一次调用结束时该局部变量的值,即
static存储类使得某些局部变量的值能在函数多次
调用之间得以保留。
8
高级语言程序设计・2005春季
变量的局
存储分配(生存期)一举例
部性
全局变量与#inoIude<iostream>
局部变量usingnamespacestd;
变量的存储intz=0;
voidf()
分配
{intx=0;
C++程序的staticinty=0;
多模块结构x++;y++;z++;
cout<X"x="x<<",y=,z«y<<",z=""zendl;
标识符的作}
用域intmain()
{f();
名空间z++;
f();
return0;
}
9
高级语言程序设计・2005春季
变量的局
存储分配(生存期)
部性
全局变量与■程序的内存分配:
局部变量
♦静态数据区(staticdata):用于全局变量、static存储类
变量的存储的局部变量以及常量的内存分配;
分配
♦代码区(code):存放所有的函数代码;
C++程序的
多模块结构栈区(stack):用于auto存储类的局部变量、函数的形
标识符的作参以及函数调用时有关信息的内存分配;
用域堆区(heap):用于动态变量的内存分配。
名空间
■在C++中如果定义变量时没有进行初始化,对于全
局变量和static存储类的局部变量,编译程序将隐
式地将它们初始化为0;对于其他变量不进行初始
化。
10
高级语言程序设计・2005春季
变量的局
C++程序的多模块结构
部性
全局变量与在逻辑上,一个C++程序由一些全局函数、全局常
局部变量量、全局变量/对象以及类的定义构成,其中必须
变量的存储
分配有且仅有一个名字为main的全局函数。
C++程序的在物理上,我们通常可以按照某种规则对构成C++
多模块结构
程序的各个逻辑单位(全局函数、全局常量/变量/
标识符的作
用域对象、类等)的定义进行分组,分别把它们放在若
名空间干个源文件中。
11
高级语言程序设计・2005春季
变量的局
C++程序的多模块结构
部性
全局变量与■在程序设计中,模块是一个可单独编译的程序单
局部变量
位。一个模块一般包含两个部分:接口和实现。
变量的存储
分配■在C++中,一个模块通常由两个源文件构成:.h
C++程序的文件(用于存放模块的接口定义)和.cpp文件(
多模块结构
用于存放模块的实现)。
标识符的作
用域■文件包含命令:
名空间#includev文件名〉:在系统指定的目录下寻找指定的文
件;
♦#include“文件名”:先在包含葫句必㊀命令的源文件所
在的目录下查找指定文件,然后再在系统指定的目录下
寻找指定文件。
12
高级语言程序设计・2005春季
变量的局
程序的多模块结构一举例
部性C++
全局变量与■MDstddef.h
局部变量
变量的存储■define.h
分配■Agentitem.h
C++程序的
多模块结构■Agectltem.cpc
标识符的作
用域
名空间
13
高级语言程序设计・2005春季
变量的局
标识符的作用域
部性
全局变量与标识符的作用域(scope)是指一个定义了的标
局部变量
识符的有效范围,即该标识符所标识的程序实体
变量的存储
分配能被访问的程序段。
C++程序的标识符的作用域一方面对定义了的标识符的使用
多模块结构
进行限制,另一方面也隐含着:作用域不相交的
标识符的作
用域两个标识符可以同名。
名空间C++把标识符的作用域分为:局部作用域、全局
作用域、文件作用域、函数作用域、函数原型作
用域、类作用域和名空间作用域。
14
高级语言程序设计・2005春季
变量的局
局部作用域
部性
全局变量与局部作用域(localscope)是指在函数定义或复
局部变量
合语句中,从标识符的定义点开始到函数定义或
变量的存储
分配复合语句结束之间的程序段。
C++程序的C++中的局部常量名、局部变量名/对象名以及函
多模块结构
数的形参名具有局部作用域。
标识符的作
1:voidf(inty)
用域
2:{y++;〃正确■y的作用域:1〜8行
名空间3:x++;〃错误■x的作用域:4〜8行
4:intx;
5:x++;〃正确
6:doublex;〃错误,w墓定义
7:chary;〃错误,宜:定义■y的作用域:9~12行
8:}
9:voidg(doubley)//确■x的作用域:10T2行
10:{doublex;//正确
11:f⑴;〃正确
12:)
15
高级语言程序设计・2005春季
变量的局
局部作用域的嵌套
部性
全局变量与如果在一个标识符的局部作用域中包含其他复合
局部变量
语句(内层复合语句),并且在该内层复合语句
变量的存储
分配中定义了一个同名的不同实体,则外层定义的标
C++程序的识符的作用域应该是从其作用域中扣除内层同名
多模块结构标识符的作用域之后得到的作用域。
标识符的作
1:voidf()
用域
2:■intx(第3行)的作用域:
名空间3:intx;♦3〜12行
4:x++;
5:while(!x)■doublex(第8行)的作用域:
6:♦8~1。行
7:x++;
8:doublex;-内层作用域覆盖了外层作用域。
9:x=1.0;
10:}
11:x++;
12:}
16
高级语言程序设计・2005春季
变量的局
全局作用域
部性
全局变量与全局作用域(globalscope)是指构成C++程序的
局部变量
所有源文件。
变量的存储
分配全局变量名/对象名、全局常量名和全局类名的作
C++程序的用域一般具有全局作用域,它们在整个程序中可
多模块结构
用。
标识符的作
用域#incIude<iostream>
usingnamespacestd;
名空间intp(5),q(7);//全局变量
voidf(){p++;q++;}
voidmain()
{P+二q;
f();
}
17
高级语言程序设计・2005春季
变量的局
全局作用域
部性
全局变量与如果在某个局部作用域中定义了与某个全局标识
局部变量符同名的标识符,则该全局标识符的作用域应扣
变量的存储
分配掉与之同名的局部标识符的作用域。
C++程序的1:intx;
多模块结构2:voidf()x(第1行)的作用域:
标识符的作3:{……所有源文件
4:intx;〃局部变量x
用域
5:x++;x(第4行)的作用域:
名空间6:■■■■■■♦4~7行
7:)
18
高级语言程序设计・2005春季
变量的局
全局作用域
部性
全局变量与■在局部标识符的作用域中若要使用与其同名的全
局部变量局标识符,则需要使用全局域选择符(作用域运
变量的存储
分配算符::)对全局标识符进行修饰。
程序的
C++1:intx;
多模块结构2:voidf()
标识符的作3:{……
4:intx;〃局部变量x
用域
5:x++;
名空间6:::x++;//全局变量X
7:)
19
高级语言程序设计・2005春季
变量的局
全局作用域
部性
全局变量与在使用全局标识符时,若该标识符的定义点在其
局部变量他源文件中或在本源文件中使用点之后,则在使
变量的存储
用前需要声明它们。
分配//fiIe2.cpp
C++程序的//fi1e1.cppinty=0;
多模块结构intx=1;voidf(){
externinty;y++;
标识符的作intmain0{x+=z;〃错误
)
用域x+二y;
cout«z;〃错误doubIez=2.0;
名空间)voidg()
{cout«z;}
通常把全局标识符的声明放在某个.h文件中,在
需要使用这些全局标识符的源文件中用/include
命令把声明文件包含进来。
20
高级语言程序设计・2005春季
变量的局
全局作用域
部性
全局变量与■在C++程序中,有时会出现下面的错误:
局部变量
声明了一个未定义的全局标识符;
变量的存储
声明了一个存在两个或两个以上定义的全局标识符;
分配
C++程序的■上述错误在编译的过程中不会发现,在联接的过
多模块结构程中会提示错误:
标识符的作
用域♦unresolvedexternalsymbol:
名空间Xalreadydefinedinfile:YYY
21
高级语言程序设计・2005春季
变量的局
文件作用域
部性
全局变量与文件作用域(filescope)是指单独的源文件。
局部变量
在全局标识符的定义中加上static修饰符,则该全
变量的存储
分配局标识符就成为具有文件作用域的标识符,它们
C++程序的只能在定义它们的源文件中使用。
多模块结构
在函数外用const定义的常量名具有文件作用域。
标识符的作
用域//fiIe1.cpp
intx=1;//全局变量
名空间externinty;
voidf(){//fiIe1.cpp
x+二y;staticintx=1;//具有文件作用域的变量
)constintL=10;//具有文件作用域的常量
externinty;
staticvoidf()//具有文件作用域的函数
(
x+二y;
)
22
高级语言程序设计・2005春季
变量的局
文件作用域&全局作用域
部性
全局变量与一般情况下,具有全局作用域的标识符主要用于
局部变量表示被程序各个模块共享的程序实体;而具有文
变量的存储
分配件作用域的标识符用于标识在一个模块内部共享
C++程序的的程序实体。
多模块结构
标识符的作
用域
名空间
23
高级语言程序设计・2005春季
变量的局
函数作用域
部性
全局变量与函数作用域(functionscope)是指由整个函数定
局部变量义所构成的程序段。
变量的存储
分配语句标号是唯一具有函数作用域的标识符,可以
C++程序的在定义它们的函数体中任何地方访问它们。
多模块结构
函数作用域与局部作用域的区别:
标识符的作
用域函数作用域包括整个函数,而局部作用域是从定义点开
名空间始到函数定义或复合语句结束;
在函数体中,一个语句标号只能定义一次;
voidf(intx)
inty;♦语句标号的作用域可以和同名的其他标识符的作用域重
gotox;
gotoy;叠。
x:y二x;
y:x二y;
)
24
高级语言程序设计・2005春季
变量的局
函数原型作用域
部性
全局变量与函数原型作用域(functionprototypescope)是指
局部变量用于函数声明的函数原型,其中的形式参数名(
变量的存储
分配如果给出)的作用域从函数原型开始到函数原型
C++程序的结束。
多模块结构
标识符的作voidf(intx,doubley)//其中x和y的作用域从“(”开始到
用域“)”结束
名空间
25
高级语言程序设计・2005春季
变量的局
名空间(namespace)
部性
全局变量与对于一个多文件构成的程序,有时会面临一个问
局部变量题:在一个源文件中要用到两个分别在其他文件
变量的存储
分配中定义的同名的全局实体。
C++程序的//fiIe1.cpp//fiIe2.cpp
多模块结构
voidf(....)voidf(....)
标识符的作
用域
名空间)}
//main.cpp
intmain()
{f();//这里要使用fiIe1.cpp中定义的f
f();//这里要使用file2.cpp中定义的f
)
26
高级语言程序设计・2005春季
变量的局
名空间(namespace)
部性
全局变量与名空间是给一组程序实体的定义取一个名字,使
局部变量之构成一个作用域一名空间作用域。
变量的存储
分配在一个名空间中定义的全局标识符,其作用域为
C++程序的该名空间。当在一个名空间外部需要使用该名空
多模块结构
间中定义的全局标识符时,可以用该名空间的名
标识符的作
用域字来修饰。
名空间
27
高级语言程序设计・2005春季
函数名空间(namespace)举例
//fiIe1.h//fiIe1.cpp
函数的定义
namespaceA(namespaceA{
函数的调用externintx;intx=1;
voidf();voidf(){x++;}
函数的参数voidg();voidg(){f0;X-=2;}
传递))
//fiIe2.h//fiIe2.cpp
namespaceB{
namespaceB(
externdoubIex;doubIex=1.0;
voidf();voidf(){x+=2;}
voidg();voidg();{x-=2;}
}1
//main,cpp
intmain0
A::f0;
B::f0;
A::x=0;
28
高级语言程序设计・2005春季
变量的局
名空间(namespace)
部性
全局变量与using声明
局部变量
♦using〈名空间,:使用某个名空间上的程序实体时,如果
变量的存储这些程序实体的名与其他全局实体的名不冲突,可在使
分配
用前使用using声明。
C++程序的
多模块结构也可以分别对某个名空间中的程序实体采用using声明。
标识符的作
//main,cpp
用域intmain()//main.cpp
{usingnamespaceA;intmain()
名空间{usingA::f;
f0;〃fiIe1中定义的f
B::f0;f0;〃fiIe1中定义的f
x=0;//fiIe1中定义的xB::f0;
A::x=0;//fiIe1中定义的x
}
29
高级语言程序设计・2005春季
变量的局
名空间(namespace)
部性
全局变量与■无名名空间
局部变量
♦对于不是定义在某个名空间中的全局程序实体,可以把
变量的存储它们看作是定义在一个全局的无名空间中。
分配
可以把文件作用域的程序实体定义成一个局部于各个源
C++程序的
多模块结构文件的无名名空间。
标识符的作namespace{
用域intx,y;<Ostaticintx,y;
名空间
■std名空间
♦C++标准库中的程序实体定义在std名空间中。
30
高级语言程序设计・2005春季
过程抽象
-函数
§4.4
31
高级语言程序设计・2005春季
递归函数递归函数的定义
递归函数的■如果一个函数在其函数体中直接或间接地调用了自
定义己,则该函数称为递归函数。直接调用自己的称为
递归函数举
例直接递归,间接调用自己的称为间接递归。
■在定义递归函数时,一定要对两种情况给出描述:
♦递归条件。递归条件指出何时进行递归调用,属于问题求
解的一般情况。
♦结束条件。结束条件指出何时不需递归,它描述了问题求
解的特殊情况或基本情况,在该情况下不需递归就能得出
结果。
32
高级语言程序设计・2005春季
递归函数递归函数实例
递归函数的■例:求用单第n个fibonacci数。
定义f0(/?=1)
递归函数举fib(n)=1(,7=2)
例
fib(n-2)+fib(n-i){n>3)
#inoIude<iostream>
usingnamespacestd;
intmain()
{intn;
cin»n;
intfib_1二0;
intfib_2=0;
for(inti=1;i<=n;i++)
{inttemp=fib_1+fib_2;
fib_1二fib_2;"
fib_2=temp;
)
cout««n<<”个斐波那契数是:"*fib_2«endl;
return0;
□
33
高级语言程序设计・2005春季
递归函数递归函数实例
递归函数的■例:求用单第n个fibonacci数。
定义f0(/?=1)
递归函数举fib(n)=1(,7=2)
例
fib(n-2)+fib(n-i){n>3)
#inoIude<iostream>
usingnamespacestd;
intfib(intn)
{if(n-0)return0;〃结束条件
elseif(n=1)〃结束条件
return1;
eIse
returnfib(n-2)+fib(n-1);//递归条件
}
intmain()
{intn;
cin»n;
cout。"第"6n«”个斐波那契数是:“"fib(n)«endI;
return0;
}
34
高级语言程序设计・2005春季
递归函数递归函数实例
递归函数的■例:求解n!。
定义
#inoIude<iostream>
递归函数举usingnamespacestd;
例intfactor(intn)
{if(n=0)return1;
returnn*factor(n-1);
}
intmain()
{intn;
cin»n;
cout«n«”的阶乘是:“<<factor(n)«endI;
return0;
}
35
高级语言程序设计・2005春季
递归函数递归与循
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论