C程序设计.ppt
- 文档编号:17306412
- 上传时间:2023-07-24
- 格式:PPT
- 页数:25
- 大小:1.04MB
C程序设计.ppt
《C程序设计.ppt》由会员分享,可在线阅读,更多相关《C程序设计.ppt(25页珍藏版)》请在冰点文库上搜索。
第7章程序结构,C+程序设计过程化编程,2023/7/24,c+程序设计,全局数据与静态数据,名空间,作用域与生命期,函数组织与头文件,预编译,本章要点,函数组织,函数:
对输入参数负责,埋头做自己的事,最终返回结果函数组织:
通过在函数中进行函数调用来扩展运行的规模,层层函数调用构成树结构做法:
将若干个函数组织成文件,又将若干个文件构成程序的办法来进行编程分工,程序文件拆分,文件,文件,文件,头文件,原始头文件:
作为共同开发的项目,为了共享彼此的过程资源(函数),将全体函数声明放在一个共用的头文件中界面头文件:
界定模块可用资源(函数,数据,类型等)(可由一个或几个头文件组合,其实现由他人提供),或提供他人使用的模块资源它是由软件工程师分发的、以规范项目开发为目的的资源文件,原始头文件:
(包含一切函数声明)/abc.hvoidf1();voidf2();voidf3();voidg1();voidg2();voidp();voidh();,/a1.cpp#include”abc.h”voidf1()if()p();g1();elseg2();h();,/a2.cpp#include”abc.h”intmain()f1();f2();f3();/-voidf3()f1();/-voidp()f3();,/a3.cpp#include”abc.h”voidh()voidf2()g1();g2();/-voidg1()voidg2(),/a1.ha1.cpp提供的资源voidf1();/a2.ha2.cpp提供的资源voidp();/a3.ha3.cpp提供的资源voidg1();voidg2();voidf2();voidh();,/a1.cpp#include”a2.h”#include”a3.h”voidf1()if()p();g1();elseg2();h();,/a2.cpp#include”a1.h”#include”a3.h”staticvoidf3();intmain()f1();f2();f3();voidf3()f1();voidp()f3();,/a3.cpp#include”a3.h”voidh()voidf2()g1();g2();voidg1()voidg2(),头文件的内容,#include预编译指令:
在编译程序前,将头文件内容展开,作为程序文件的一部分,然后进行编译。
C+中,头文件的作用是给源程序提供可以使用的外部资源一览表头文件包括的内容全局数据声明/externintn;函数声明/voidfn();类型声明/classA;全局常量定义/constdoublepi=3.14;内联函数声明/inlinevoidfn();模板声明和定义/templateclassA;名空间定义/namespaceN;类型定义/structB;classA;预编译指令/#include注释,头文件不能包括,全局数据定义inta;函数定义voidfn(),全局数据(GlobalData),全局数据:
在任何函数外部声明或定义的,在程序范围内可以访问的数据。
例如:
在a.txt文件中读入由行、列两个整数开头的矩阵数据,转置,然后输出。
3512367891235618156342712,解决办法,方法1:
全局数据优点:
使用全局数据,避免了参数传递,轻松方便问题:
破坏了模块的独立性,函数无法重用方法2:
采用参数传递优点:
模块化程度高,独立性好,可重用,全局数据定义,全局数据区的整个区域在程序启动时,初始化为0全局数据可有声明多次,但只能定义一次如何声明全局数据?
在全局数据定义形式前加extern注意:
全局数据声明写成初始化形式,即为定义如:
externintn=8;全局数据声明可写入头文件,/item1.cpp#includeintn=8;voidf();intmain()std:
coutn”n”;f();,/item2.cpp#includeintn;voidf()std:
coutn”n”;,/item2.cpp#includeexternintn;voidf()std:
coutn”n”;,全局常量,全局常量不允许在同一个程序文件中反复定义,但可以在不同的程序文件中重复定义,多个文件中的全局常量可以取不同值,静态数据(StaticData),静态全局数据:
在一个程序文件中共享的数据,在其他的程序文件中不可见。
定义形式:
在定义前加static关键字在程序中,只为文件中其他的函数服务,并不对外提供服务的函数称为静态全局函数;只为本文件服务,不是全局的变量称为静态全局变量。
注:
无静态全局变量,/a2.cpp#include”a1.h”#include”a3.h”staticvoidf3();intmain()f1();f2();f3();voidf3()f1();voidp()f3();,三种链接性,内部链接性:
在代码块外声明,只在本文件可见,一般为static声明的静态全局数据;外部链接性:
在代码块外声明,在整个程序文件均可见,const定义除外;无链接性:
仅在本代码块可见,静态局部数据,函数内定义的变量为局部变量,定义前加static,成为静态局部数据。
静态局部数据:
在屡次调用的同一个函数中共享的数据,函数第一次被调用时建立,直到程序运行结束,示例,#includeusingnamespacestd;voidfunc();intn=1;intmain()inta=0,b=-10;couta=a,b=b,n=nendl;func();couta=a,b=b,n=nendl;func();voidfunc()staticinta=2;intb=5;a+=2,b+=5;n+=12;couta=a,b=b,n=nendl;,作用域与生命期作用域,作用域:
标识符对程序而言可见的范围C+的作用域:
全局作用域:
在整个程序范围内有效文件作用域:
只在某程序文件本地有效函数作用域:
不管名称在函数的什么地方声明,总是可以在函数的任何位置使用该名称。
例如:
标号函数声明作用域:
表明函数声明时的形参与上下文无关类作用域:
类似名空间局部作用域:
在函数内部的动作序列描述中,依据各语句块甚至整个函数体范围内所定义的数据应遵循的数据访问规则。
#includeusingnamespacestd;voidfn(inty);intj=8;/j为全局作用域intmain()intx=1;fn(x);/-x作用域结束,voidfn(inty)/y作用域开始if(inti=1)i=2*i;/if语句块,i作用域开始elsei=100;/if语句块结束,则i作用域结束intx=1;/x作用域开始if(xy)coutxendl;elsecoutyendl;/-x作用域结束switch(inti=2)/switch语句块,i作用域开始case1:
coutiendl;/switch语句块结束,则i作用域结束i=3;/errorintsum=0;/sum作用域开始for(inti=0;i10;+i)/i作用域开始sum+=i;/i作用域结束intj=3;/fn函数块中,intj作用域开始charch;/fn函数块中,charch作用域开始doublej;/本块中,doublej作用域开始j=5;/虽赋整数于j,但仍然指doublej,非intj:
j=6;/全局变量通过:
操作可见,但局部intj不可见ch=A;/本块中没有定义ch变量,则外块ch可见/doublej作用域结束j=6.0;/intj可见/j,ch,y,sum作用域结束,作用域与生命期生命期,生命期:
一个实体产生后,存活时间的度量各类数据的生命期:
动态生命期:
new:
在堆区动态分配创建一个规定类型的实体,并返回该实体的地址,delete:
动态创建的对象用完后,释放指针所指向的地址空间由new所创建的实体具有动态生命期作用域与生命期以及在实体名称交叉作用域中的可见性问题,是编译器判断其名字可否访问的规则。
#includeint*fn()int*ap=newint;returnap;intmain()int*bp=fn();*bp=15;std:
cout*bpn;deletebp;,通过作用域无法解决的可见性问题,inta=3;voidfn()inta=5;inta=7;coutaendl;cout:
aendl;,名空间,名空间:
解决名字冲突的方法所有名字都有空间归属,在一定的空间中,名字是不允许冲突的引用一个名字时,加上空间归属的前缀:
,就可以唯一确定该名字所对应的实体名空间的定义:
namespacename/名称声明或定义名空间总是凌驾于其他程序文件之上,是其他程序文件中的所有外部名称使用的规范描述名空间的定义一般放在头文件中,名空间示例,namespaceblipintbi=16,bj=15,bk=23;/其他声明intbj=0;voidmanip()usingnamespaceblip;/using指示符-/:
bj和blip:
bj之间的冲突只在bj被使用时才被检测+bi;/设置blip:
bi为17+bj;/错误:
二义性,全局bj还是blip:
bj?
+:
bj;/ok:
设置全局bj为1+blip:
bj;/ok:
设置blip:
bj为16intbk=97;/局部bk隐藏blip:
bk+bk;/设置局部bk为98,名空间的用法,使用using编译指令:
使整个名称空间可用usingnamespce名空间名如usingnamespacestd;使用using声明:
使指定标识符可用using名空间名:
标识符名如usingstd:
cout注:
如果没有前缀的名空间名,只有”:
”加在名称前,表示不属于任何名空间的全局名称,预编译,预编译:
+在正式编译前的准备工作,它包括文件的加入、代码的取舍、字符的替代等操作常用的预编译指令:
#include:
指示预编译将包含的头文件的内容附加在程序文件中,以参加编译条件指令:
#if,#elif,#else,#endif,#ifdef,#ifndef定义指令:
#define,#undef,头文件的可嵌套性,使得必须人为控制文件的展开,/a.h#include”b.h”/,/x.cpp#include”a.h”#include”b.h”/,/b.hstructDateintyear,month,day;,头文件卫士,若头文件中出现类或结构定义,则应在其外面施加保护,保护的方法是采用宏定义指令,以保证该类或结构定义只执行一次/b.h#ifndefDATE#defineDATEstructDateintyear,month,day;#endif,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)