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