面向对象程序设计6程序结构.ppt
第六章 程序结构,面向对象程序设计,程序结构:一个C+程序是由一个或多个包含若干函数定义的源文件组成。只有一个源文件具有主函数main()学习目标:1.初步理解+程序的结构2.掌握多文件之间如何进行“沟通”,2,面向对象程序设计,主要内容,1外部存储类型2 静态存储类型3 作用域、生命期、可见性4 头文件5 多文件结构6 编译预处理,3,面向对象程序设计,1外部存储类型,多个源文件间通过声明外部存储类型来进行沟通声明外部存储类型(extern)如:extern int n;extern void fn1();/extern可省略默认的函数声明或定义是extern的声明一般放在源文件开始位置带extern的外部变量声明,是声明,不是变量定义。,4,面向对象程序设计,外部存储类型的使用,/a.cpp源文件#include using namespace std;int fun();/在b.cpp中定义的extern int n;/n在b.cpp中定义int main()coutnendl;n=20;coutfun()endl;,5,面向对象程序设计,/b.cpp源文件int n=6;int fun()n+;return n;,2 静态存储类型,静态存储类型(static)如:static int n;static void fun();静态全局变量、静态函数:仅在其定义的源文件中可用,对于程序中其它源文件是无效的。静态局部变量:在屡次调用的同一个函数中共享的数据,6,面向对象程序设计,静态全局变量、静态函数,/a.cpp源文件#include using namespace std;void fun();/在b.cpp中定义的static int n;/仅在本源文件中使用int main()n=20;coutnendl;fun();,7,面向对象程序设计,/b.cpp源文件int n=6;void fun()coutn;coutendl;,3 作用域、生命期、可见性,作用域:标识符在程序中有效的范围。可见性:标识符在某位置可见,即指它可被引用生命期:实体存在的时间。全局变量、局部变量、静态局部变量静态局部变量驻留在全局数据区。从可见性来说,它与局部变量一致;从生命期来说,它与全局变量一致;当全局变量与局部变量同名时,全局变量不可见,8,面向对象程序设计,局部变量、静态局部变量、全局变量,int a=2;void fn()int x=1;/int a=3;static int y=0;x+=a;y+=a;coutx yendl;int main()for(int i=0;i10;+i)fn();,9,面向对象程序设计,处于生命期中的实体总是能被安全访问到,即使违背模块的黑盒准则,int*f()static int a=1;/静态局部变量 a+;return/运行结果 8,10,面向对象程序设计,生命期消亡的实体,其空间位置上的访问,得不到安全保证,int*f()int a=1;/局部变量 int*p=/a的生命期在此处消亡,int main()int*pa=f();cout*pa“n”;cout*pa“n”;/1/4198830,11,面向对象程序设计,4 头文件,程序经常由多个源文件组成,而具有外部存储类型的声明可以在多个源文件中引用,因此,可能要出现多次。应将声明等放在头文件中,例6_5。头文件起着源文件之间接口的作用,即表明了哪些信息对其它文件可见,哪些不可见。,面向对象程序设计,12,头文件-源文件间的接口,/a1.h a1.cpp提供的资源void f1();/a2.h a2.cpp提供的资源void p();/a3.h a3.cpp提供的资源void g1();void g2();void f2();void h();,13,面向对象程序设计,使用头文件,/a1.cpp#include”a2.h”#include”a3.h”void f1()if()p();g1();elseg2();h();,14,面向对象程序设计,/a2.cpp#include”a1.h”#include”a3.h”static void f3();int main()f1();f2();f3();,使用头文件,void f3()f1();void p()f3();,15,面向对象程序设计,使用头文件,/a3.cpp#include”a3.h”void h()void f2()g1();g2();void g1()void g2(),16,面向对象程序设计,头文件可包括:,全局数据声明函数声明类型说明全局常量定义内联函数定义模板声明和定义名空间定义类型定义预编译指令注释,头文件一定不能包括:,全局数据定义函数定义,17,面向对象程序设计,5 多文件结构,预编译:产生翻译单元,该翻译单元以临时文件的形式存放在计算机中。编译:进行语法检查,产生目标文件.obj连接:若干个目标文件经过连接,产生可执行文件.exe。连接包括C+库函数和编制类库。,面向对象程序设计,18,5 多文件结构,面向对象程序设计,19,6 编译预处理,#include包含指令#include#include“abc.h”#define宏定义指令条件编译指令#ifndef NULL#define NULL(void*)0)#endif,面向对象程序设计,20,头文件的可嵌套性,使得必须人为控制文件的展开操作。(x.cpp中将出现二次struct Date定义),/a.h#include”b.h”/,/x.cpp#include”a.h”#include”b.h”/,/b.hstruct Date int year,month,day;,21,面向对象程序设计,若头文件中出现类或结构定义,则应在其外面施加保护保护的方法是采用宏定义指令。以保证该类或结构定义只执行一次,/b.h#ifndef DATE#define DATE struct Date int year,month,day;#endif,22,面向对象程序设计,*名空间*,名空间:解决名字冲突的方法。所有名字都有空间归属,在一定的空间中,名字是不允许冲突的。引用一个名字时,加上空间归属的前缀,就可以唯一确定该名字所对应的实体无前缀名字:很多时候,名字都是无前缀的,这是因为事先已经指定了默认名字空间。如果默认名空间在两个以上,则必须注意名字冲突的可能性,23,面向对象程序设计,名空间的使用,#includeusing std:cout;using std:endl;/-int abs(int a)return a0?a:-a;/-int main()int a=abs(-5);/使用自定义函数 int b=std:abs(-5);/使用标准库函数 coutaendlbendl;,24,面向对象程序设计,