清华大学C课程课件第5讲_第1页
清华大学C课程课件第5讲_第2页
清华大学C课程课件第5讲_第3页
清华大学C课程课件第5讲_第4页
清华大学C课程课件第5讲_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第五章第五章 c+程序的结构程序的结构清华大学清华大学c+语言程序设计c+语言程序设计2本章主要内容本章主要内容l作用域与可见性作用域与可见性l对象的生存期对象的生存期l数据与函数数据与函数l静态成员静态成员l友元友元l共享数据的保护共享数据的保护l编译预处理命令编译预处理命令l多文件结构和工程多文件结构和工程c+语言程序设计3作用域作用域 作用域是一个标识符在程序正文中有作用域是一个标识符在程序正文中有效的区域。作用域开始于标识符的声效的区域。作用域开始于标识符的声明处。明处。c+c+中标识符的作用域有中标识符的作用域有: : 函数原型作用域函数原型作用域 块作用域块作用域 类作用域类作用

2、域 文件作用域文件作用域 作用域与可见性c+语言程序设计4函数原型的作用域函数原型的作用域l函数原型中的参数,其作用域始于函数原型中的参数,其作用域始于(,结束于,结束于)。l例如,设有下列原型声明:例如,设有下列原型声明:double area(double radius);radius 的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。作用域与可见性c+语言程序设计5块作用域块作用域 在块中声明的标识符,其作用域自声明处在块中声明的标识符,其作用域自声明处起,限于块中,例如:起,限于块中,例如:void fun(int a) int b(a); cinb; if (b0) int

3、c; . c的作用域b的作用域作用域与可见性c+语言程序设计6类作用域类作用域l类的成员的作用域是类的成员的作用域是类作用域类作用域,在类外,在类外部只有通过对象名和成员访问符部只有通过对象名和成员访问符“.”来来访问类的公有成员。在类外不能访问类访问类的公有成员。在类外不能访问类的私有成员的私有成员 。 l类的成员函数可以直接访问类的数据成类的成员函数可以直接访问类的数据成员。员。作用域与可见性c+语言程序设计7文件作用域文件作用域 不在前述各个作用域中出现的声明,不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识符具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件

4、的作用域开始于声明点,结束于文件尾。尾。作用域与可见性c+语言程序设计8可见性可见性l可见性是从对标识符的引用的角度来谈可见性是从对标识符的引用的角度来谈标识符的有效性。标识符的有效性。l可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域“看看”时能看见什么。时能看见什么。l如果标识在某处可见,则就可以在该处如果标识在某处可见,则就可以在该处引用此标识符引用此标识符。块作用域类作用域文件作用域作用域与可见性c+语言程序设计9可见性可见性l标识符应声明在先,引用在后。标识符应声明在先,引用在后。l如果某个标识符在外层中声明,且在内层中如果某个标识符在外层中声明,且在内层中没有同

5、一标识符的声明,则该标识符在内层没有同一标识符的声明,则该标识符在内层可见。可见。l对于两个嵌套的作用域,如果在内层作用域对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。外层作用域的标识符在内层不可见。作用域与可见性c+语言程序设计10#includeusing namespace std;int i; /文件作用域int main() i=5; int i; /块作用域 i=7; couti=iendl; /输出7 couti=i; /输出5 return 0;作用域与可见性例例 5-1c+语言

6、程序设计11对象的生存期对象的生存期对象都有诞生和结束的时刻。对象从诞对象都有诞生和结束的时刻。对象从诞生到结束的这段时间就是它的生存期。生到结束的这段时间就是它的生存期。对象对象的生存期与对象的存储类型相关。的生存期与对象的存储类型相关。静态生存期:内存中固定的数据区中存静态生存期:内存中固定的数据区中存储储(全局数据区)全局数据区)。动态生存期:内存的栈区存储。动态生存期:内存的栈区存储。内存格局:全局数据区代码区栈区堆区c+语言程序设计12静态生存期静态生存期l这种生存期与程序的运行期相同。这种生存期与程序的运行期相同。l在文件作用域中声明的对象具有这种在文件作用域中声明的对象具有这种生

7、存期。生存期。l在函数内部声明静态生存期对象,要在函数内部声明静态生存期对象,要冠以关键字冠以关键字static 。对象的生存期c+语言程序设计13#includeusing namespace std;int i=5; /文件作用域int main() couti=iendl; return 0;i具有静态生存期对象的生存期例例c+语言程序设计14动态生存动态生存期期l块作用域中声明的,没有用块作用域中声明的,没有用static修修是的对象是动态生存期的对象(习惯是的对象是动态生存期的对象(习惯称局部生存期对象)。称局部生存期对象)。l开始于程序执行到声明点时,结束于开始于程序执行到声明点时

8、,结束于命名该标识符的作用域结束处。命名该标识符的作用域结束处。对象的生存期c+语言程序设计15#includeusing namespace std;void fun();int main() fun(); fun();void fun() static int a=1; int i=5; a+; i+; radius 的作用域仅在于此,不能用于程序正文其它地方,因而可有可无 couti=i,a=aendl;对象的生存期例例运行结果:i=6, a=2i=6, a=3i是动态生存期a是静态生存期c+语言程序设计16例:求数据序列的平均值例:求数据序列的平均值staticstatic局部变量的持

9、续效果局部变量的持续效果 要求:要求: 计算当前所有输入数据的平均值。计算当前所有输入数据的平均值。 方法:方法: 使用静态局部变量,使累加和持续保持。使用静态局部变量,使累加和持续保持。 原因:原因: static局部变量是具有静态生存期的局部变局部变量是具有静态生存期的局部变量,具有全局的寿命和局部的可见性。量,具有全局的寿命和局部的可见性。 c+语言程序设计17#include iostream#include using namespace std; using namespace std; int average(intint average(int i) i) /声明静态局部变量,

10、具有全局寿命,局部可见声明静态局部变量,具有全局寿命,局部可见 static intstatic int sum = 0, count = 0; sum = 0, count = 0; sum = sum + i; count+; sum = sum + i; count+; return sum / count; return sum / count; intint main() main() int num,avg int num,avg; /; /局部变量,具有动态生存期局部变量,具有动态生存期 coutcout enter numbers (-1 to quit): ; num; nu

11、m; if(num != -1) if(num != -1) avg avg= average(num); = average(num); while(num -1); while(num -1); cout average is: avg endl cout average is: avg endl; ; return 0; return 0; c+语言程序设计18例例5-3具有静态、动态生存期对象的时钟程序具有静态、动态生存期对象的时钟程序#includeusing namespace std;class clock /时钟类声明时钟类声明public:/外部接口外部接口clock();v

12、oid settime(int newh, int newm, int news); /三个形参均具有函数原型作用域三个形参均具有函数原型作用域void showtime();clock()private:/私有数据成员私有数据成员int hour,minute,second;对象的生存期/时钟类成员函数实现时钟类成员函数实现clock:clock()/构造函数构造函数 hour=0;minute=0;second=0;void clock:settime(int newh, int newm, int news) hour=newh;minute=newm;second=news;void

13、clock:showtime() couthour:minute:secondendl;20clock globclock;/声明对象声明对象globclock, /具有静态生存期,文件作用域具有静态生存期,文件作用域int main()/主函数主函数coutfirst time output:endl;/引用具有文件作用域的对象:引用具有文件作用域的对象:globclock.showtime(); /对象的成员函数具有类作用域对象的成员函数具有类作用域globclock.settime(8,30,30);clock myclock(globclock); /声明具有块作用域的对象声明具有块作

14、用域的对象myclockcoutsecond time output:endl;myclock.showtime(); /引用具有块作用域的对象引用具有块作用域的对象21c+语言程序设计21数据共享机制数据共享机制l函数间共享数据函数间共享数据l类对象之间共享数据类对象之间共享数据 静态成员静态成员l不同类或对象的成员函数之间、类的成员不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享函数与一般函数之间进行数据共享 友元友元c+语言程序设计22数据与函数数据与函数 函数间如何进行数据共享。函数间如何进行数据共享。l数据存储在局部对象中,通过参数传数据存储在局部对象中,通过参数传

15、递实现共享递实现共享函数间的参数传递。函数间的参数传递。l数据存储在全局对象中。数据存储在全局对象中。l将数据和使用数据的函数封装在类中。将数据和使用数据的函数封装在类中。数据与函数c+语言程序设计23使用全局对象使用全局对象#includeusing namespace std;int global;void f() global=5;void g() coutglobalendl;int main() f(); g(); /输出输出“5” return 0;数据与函数c+语言程序设计24应避免使用不必要的全局变量应避免使用不必要的全局变量 l全局变量存储在全局变量存储在全局数据全局数据区内

16、,在整个执行过区内,在整个执行过程中,它们都会占用内存,而不只是在需要时程中,它们都会占用内存,而不只是在需要时才占用内存。才占用内存。l在可以使用局部变量的地方使用全局变量会降在可以使用局部变量的地方使用全局变量会降低函数的通用性,由于这样的函数依赖于在其低函数的通用性,由于这样的函数依赖于在其外部定义的变量。外部定义的变量。l太多的全局变量会带来未知的、预料不到的副太多的全局变量会带来未知的、预料不到的副作用。作用。c+语言程序设计25将函数与数据封装将函数与数据封装#includeusing namespace std;class application public: void f()

17、; void g(); private: int global;void application:f() global=5;void application:g() coutglobalendl;int main() application myapp; myapp.f(); myapp.g(); return 0;数据与函数这也是类应用的另一种方式。c+语言程序设计26类对象之间共享数据类对象之间共享数据l类中有一些属性归所有对象共有。类中有一些属性归所有对象共有。l每个类对象中会存储该类数据成员的拷贝。每个类对象中会存储该类数据成员的拷贝。l静态成员用于解决同一个类的不同对象之间数静态成员

18、用于解决同一个类的不同对象之间数据共享问题。据共享问题。l静态成员是静态成员是“类属性类属性”的概念。如果某个属性的概念。如果某个属性为整个类所共有,不属于任何一个具体对象,为整个类所共有,不属于任何一个具体对象,则采用则采用staticstatic关键字来声明为静态成员。关键字来声明为静态成员。c+语言程序设计27静态成员静态成员l静态数据成员静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝在类的声明中仅仅对静态数据成员进行引用性声明,必须在类外定义和初始化,用(:)来指明所属的类。l静态成员函数静态成员函数 类外代码可以使用类名和作用域操作符(:)来调用静态成员函数

19、。 静态成员函数一般用来引用属于该类的静态数据成员或静态成员函数。静态成员c+语言程序设计28 公有静态数据成员公有静态数据成员 #include iostream#include using namespace std; using namespace std; class pubclassclass pubclass public: public: static intstatic int num; num; /公有静态数据成员的声明公有静态数据成员的声明void shownum() cout the num is:num endlvoid shownum() cout the num i

20、s:num endl; ; ; ; int pubclass:numint pubclass:num; ; /在类外定义在类外定义num num intint main() main() pubclasspubclass a, b; a, b; pubclass:numpubclass:num = 1000; / = 1000; /通过类名访问静态成员通过类名访问静态成员num num a.shownum(); b.shownuma.shownum(); b.shownum(); (); a.numa.num = 2000; = 2000; /通过对象访问静态成员通过对象访问静态成员num n

21、um a.shownum(); b.shownuma.shownum(); b.shownum(); (); return 0; return 0; c+语言程序设计29私有型静态数据成员私有型静态数据成员 #include iostream#include using namespace std; using namespace std; class priclassclass priclass static intstatic int num num; ; /私有型静态成员私有型静态成员 public: public: void setnum(int void setnum(int i)

22、i) numnum = i; ; = i; ; void shownum() cout void shownum() cout the num is: the num is:numnum n; n; ; ; int priclass:numint priclass:num; ; /在类外定义在类外定义 num num intint main() main() priclasspriclass a, b; a, b; a.shownum(); b.shownum a.shownum(); b.shownum(); (); a.setnuma.setnum(1000); (1000); /设置静态

23、成员设置静态成员numnum为为1000 1000 a.shownum(); b.shownum a.shownum(); b.shownum(); (); return 0; return 0; c+语言程序设计30静态函数成员静态函数成员 #include iostream#include using namespace std; using namespace std; class funclassclass funclass static intstatic int count count; /; /静态数据成员声明静态数据成员声明public: public: funclassfun

24、class() () count+count+; ; funclassfunclass() () count-count-; ; static int getcountstatic int getcount() return count; () return count; / /静态函数成员静态函数成员; ; int funclass:countint funclass:count; ; /静态数据成员定义静态数据成员定义intint main() main() funclassfunclass a, b, c; a, b, c; coutcout from class, count is f

25、rom class, count is funclass:getcountfunclass:getcount()() endl endl; ; coutcout from object, count is from object, count is a.getcounta.getcount()() endl endl; ; return 0; return 0; c+语言程序设计31静态成员函数举例静态成员函数举例class a public: static void f(a a); private: int x;void a:f(a a) coutx; /对对x的引用是的引用是错误错误的的

26、couta.x; /正确正确静态成员c+语言程序设计32静态成员函数举例静态成员函数举例#includeusing namespace std;class application public: static void f(); static void g(); private: static int global;int application:global =0;void application:f() global=5;void application:g() coutglobalendl;int main() application:f(); application:g(); retu

27、rn 0;静态成员c+语言程序设计33例例5-4 具有静态数据、函数成具有静态数据、函数成员的员的 point类类#include using namespace std;class point /point类声明类声明public:/外部接口外部接口point(int xx=0, int yy=0) x=xx;y=yy;countp+;point(point &p); /拷贝构造函数拷贝构造函数int getx() return x;int gety() return y;static void getc() cout object id=countpendl;private:/私有

28、数据成员私有数据成员int x,y;static int countp;静态成员point:point(point &p) x=p.x;y=p.y;countp+;int point:countp=0;void main() /主函数实现主函数实现 point a(4,5);/声明对象声明对象acoutpoint a,a.getx(),a.gety();a.getc(); /输出对象号,对象名引用输出对象号,对象名引用point b(a);/声明对象声明对象bcoutpoint b,b.getx(),b.gety();point:getc();/输出对象号,类名引用输出对象号,类名引用

29、32c+语言程序设计35友元友元l友元是友元是c+提供的一种破坏数据封装和数据隐提供的一种破坏数据封装和数据隐藏的机制。藏的机制。l在一个类中,可以利用关键字在一个类中,可以利用关键字friend将其它函将其它函数或类声明为友元。数或类声明为友元。如果友元是一般函数或其如果友元是一般函数或其他类的成员函数,称为友元函数;如果友元是他类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函一个类,则称为友元类,友元类的所有成员函数都自动成为友元函数数都自动成为友元函数。l为了确保数据的完整性,及数据封装与隐藏的为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少

30、使用友元。原则,建议尽量不使用或少使用友元。c+语言程序设计36友元函数友元函数l友元函数是在类声明中由关键字友元函数是在类声明中由关键字friend修饰说明的修饰说明的非成员函数非成员函数,在它的函数,在它的函数体中能够通过体中能够通过对象名对象名访问访问 private 和和 protected成员成员,当然也能访问当然也能访问public成成员。员。l访问对象中的成员必须通过对象名。访问对象中的成员必须通过对象名。l作用:增加灵活性,使程序员可以在作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。封装和快速性方面做合理选择。 友 元c+语言程序设计37例例5-6 使用友元函数计

31、算两点距离使用友元函数计算两点距离#include #include using namespace std;class point /point类声明类声明 public:/外部接口外部接口point(int xx=0, int yy=0) x=xx;y=yy;int getx() return x;int gety() return y;friend float distance(point &a, point &b); private:/私有数据成员私有数据成员int x,y; 友 元double distance( point& a, point& b)

32、 double dx=a.x-b.x; double dy=a.y-b.y; return sqrt(dx*dx+dy*dy);int main() point p1(3.0, 5.0), p2(4.0, 6.0); double d=distance(p1, p2); coutthe distance is dendl; return 0;36c+语言程序设计39友元类友元类l若一个类为另一个类的友元,则此类若一个类为另一个类的友元,则此类的所有函数成员都能访问对方类的私的所有函数成员都能访问对方类的私有成员和保护成员。有成员和保护成员。l声明语法:将友元类名在另一个类中声明语法:将友元类名

33、在另一个类中使用使用friend修饰说明。修饰说明。 友 元c+语言程序设计40友元类举例友元类举例#include iostream#include using namespace std;using namespace std;class baseclassclass baseclass/定义定义baseclassbaseclass类类 friend class friclassfriend class friclass; ; / /指定指定friclassfriclass是它的友元类是它的友元类 private:private: int int num; num; public: pub

34、lic: baseclass(int baseclass(int n)num=n; n)num=n; void display() void display() coutthe num :numendl coutthe num :numendl; ; ;class friclassclass friclass / /定义定义friclassfriclass,它是,它是baseclassbaseclass类的类的友元类友元类 public:/ public:/成员函数直接使用成员函数直接使用baseclassbaseclass类的私有成员类的私有成员 void disp1(baseclass y

35、cvoid disp1(baseclass yc) ) cout coutthe num is:the num is:yc.numyc.numendlendl; ; void disp2(baseclass yc void disp2(baseclass yc) ) yc.displayyc.display()();intint main() main() baseclass baseclass a(10),b(100); / a(10),b(100); /声明声明baseclassbaseclass类对象类对象 coutbaseclass:endlcoutbaseclass:endl; ;

36、a.display(); b.display(); a.display(); b.display();/显示显示a a和和b b对象的值对象的值 friclass fcfriclass fc; ; /声明声明friclassfriclass类对象类对象 coutfriclass:endlcoutfriclass:endl; ; fc.disp1(a); fc.disp2(b);fc.disp1(a); fc.disp2(b); / /通过通过fcfc显示显示a a和和b b对象的值对象的值 return 0;return 0;39c+语言程序设计42友元关系是单向的友元关系是单向的 友元关系是

37、单向的,如果只声明友元关系是单向的,如果只声明b b类是类是a a类的友元,类的友元,a a类不会自动成为类不会自动成为b b类类的友元。的友元。c+语言程序设计43共享数据的保护共享数据的保护 l数据共享会不同程度破坏数据的安全数据共享会不同程度破坏数据的安全性。性。l既共享,又保护的机制既共享,又保护的机制 常类型机制常类型机制l常引用、常对象、常成员函数、常成常引用、常对象、常成员函数、常成员数据员数据c+语言程序设计44常引用常引用l在声明引用时用在声明引用时用const修饰,被声明的就修饰,被声明的就是常引用。是常引用。l不能通过常引用修改所引用的对象。不能通过常引用修改所引用的对象

38、。l用常引用做形参,便不会意外地发生对用常引用做形参,便不会意外地发生对实参的更改。实参的更改。 const 类型说明符 &引用名 共享数据的保护c+语言程序设计45常引用做形参常引用做形参 通过引用做形参有两个理由:通过引用做形参有两个理由:l函数通过形参可以改变实参的值;函数通过形参可以改变实参的值;l在函数执行中形实结合时,不需要给形在函数执行中形实结合时,不需要给形参分配内存。如果被传递的参数要占用参分配内存。如果被传递的参数要占用大量的存储空间,则使用引用传递将更大量的存储空间,则使用引用传递将更有效。在这种情况下,如果不希望函数有效。在这种情况下,如果不希望函数修改实参的内

39、容,可以将参数声明为常修改实参的内容,可以将参数声明为常引用。引用。 共享数据的保护c+语言程序设计46例例5-7常引用做形参常引用做形参#includeusing namespace std;void display(const double& r);int main() double d(9.5); display(d); return 0;void display(const double& r)/常引用做形参,在函数中不能更新常引用做形参,在函数中不能更新 r所引用的对象。所引用的对象。 coutrendl; 共享数据的保护c+语言程序设计47常对象常对象l常对象的数据

40、成员值在对象的整个生常对象的数据成员值在对象的整个生存期间内不能被改变。存期间内不能被改变。l常对象必须进行初始化,而且不能被常对象必须进行初始化,而且不能被更新。更新。l声明常对象的语法形式为:声明常对象的语法形式为: const 类名类名 对象名对象名c+语言程序设计48常对象举例常对象举例#include iostream#include using namespace std;using namespace std;class zrfclass zrfpublic:public: zrf(int i) num=i; cout zrf(int i) num=i; coutzrf is c

41、onstructedn;zrf is constructedn; zrf() cout zrf() coutzrf is destructedn;zrf is destructedn;void disp() coutthe value of num is:numendlvoid disp() coutthe value of num is:numendl;intint num; num;intint main() main() const const zrf x(10); / zrf x(10); / 声明常对象声明常对象x.num=20;x.num=20;/error1/error1对常对象

42、的成员赋值对常对象的成员赋值 x.dispx.disp();();/error2/error2不能通过常对象调用普通的成员函数不能通过常对象调用普通的成员函数 return 0;return 0; c+语言程序设计49用用const修饰的成员修饰的成员l常成员函数常成员函数 使用const关键字说明的函数。 常成员函数不更新对象的数据成员。 常成员函数说明格式:类型说明符 函数名(参数表)const;这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。const关键字可以被用于参与对重载函数的区分l通过常对象只能调用它的常成员函数通过常对象只能调用它的常成员函数。l

43、常数据成员常数据成员 使用const说明的数据成员。成员函数不可以对常数据成员赋值,初值只能通过初始化列表得到。 共享数据的保护c+语言程序设计50例例5-8 常成员函数举例常成员函数举例#includeusing namespace std;class r public: r(int r1, int r2)r1=r1;r2=r2; void print(); void print() const; private: int r1,r2; 共享数据的保护void r:print() coutr1:r2endl;void r:print() const coutr1;r2endl;int mai

44、n() r a(5,4); a.print(); /调用调用void print() const r b(20,52); b.print(); /调用调用void print() const46c+语言程序设计52编译预处理编译预处理l预处理发生在程序编译之前,可以涉及如下方面:预处理发生在程序编译之前,可以涉及如下方面: 将其它文件包含在要编译的文件中;将其它文件包含在要编译的文件中; 定义标识符定义标识符 程序代码的条件编译程序代码的条件编译l所有的预处理程序指令都以所有的预处理程序指令都以#开头开头,并且在一行预处,并且在一行预处理程序指令中,只有空白字符才能出现在前面。理程序指令中,只

45、有空白字符才能出现在前面。l预处理程序指令不是预处理程序指令不是c+语句,语句结尾不用加分语句,语句结尾不用加分号号(;)。l在开始编译前,预处理程序指令就已经完全处理好在开始编译前,预处理程序指令就已经完全处理好了。了。 c+语言程序设计53编译预处理命令编译预处理命令l#include 包含指令包含指令 将一个源文件嵌入到当前源文件中该点处。 #include l按标准方式搜索,文件位于c+系统目录的include子目录下 #include文件名l首先在当前目录中搜索,若没有,再按标准方式搜索。l#define 宏定义指令宏定义指令 定义符号常量,很多情况下已被const定义语句取代。 定

46、义带参数宏,已被内联函数取代。 在c+中用来定义标识符l#undef 删除由#define定义的宏,使之不再起作用。c+语言程序设计54条件编译指令条件编译指令 #if #if 和和 #endif#endif#if 常量表达式常量表达式 /当当“ 常量表达式常量表达式”非零时编译非零时编译 程序正文程序正文 #endif. 编译预处理命令c+语言程序设计55条件编译指令条件编译指令#else#else #if 常量表达式常量表达式 /当当“ 常量表达式常量表达式”非零时编译非零时编译 程序正文1#else /当“ 常量表达式”为零时编译 程序正文2#endif 编译预处理命令c+语言程序设计5

47、6条件编译指令条件编译指令 #elif#if 常量表达式常量表达式1 程序正文程序正文1 /当当“ 常量表达式常量表达式1”非零时编译非零时编译#elif 常量表达式常量表达式2 程序正文程序正文2 /当当“ 常量表达式常量表达式2”非零时编译非零时编译#else 程序正文程序正文3 /其它情况下编译其它情况下编译#endif 编译预处理命令c+语言程序设计57条件编译指令条件编译指令#ifdef 标识符标识符 程序段程序段1#else 程序段程序段2#endif如果如果“标识符标识符”经经#define定义过,且定义过,且未经未经undef删除,则编译程序段删除,则编译程序段1,否则,否则编

48、译程序段编译程序段2。 编译预处理命令c+语言程序设计58条件编译指令条件编译指令#ifndef 标识符标识符 程序段程序段1#else 程序段程序段2#endif如果如果“标识符标识符”未被定义过,则编译程未被定义过,则编译程序段序段1,否则编译程序段,否则编译程序段2。 编译预处理命令c+语言程序设计59多文件结构(多文件结构(例例5-10)l一个源程序可以划分为多个源文件:一个源程序可以划分为多个源文件: 类声明文件(.h文件) 函数原型、常量定义、类声明、其他类型声明等 类实现文件(.cpp文件) 类的使用文件(main()所在的.cpp文件)l利用工程来组合各个文件。利用工程来组合各

49、个文件。c+语言程序设计60不使用条件编译的头文件不使用条件编译的头文件/main.cpp#include file1.h#include file2.hint main() /file1.h#include head.h /file2.h#include head.h /head.h class point 多文件结构c+语言程序设计61使用条件编译的头文件使用条件编译的头文件/head.h#ifndef head_h #define head_h class point #endif 多文件结构c+语言程序设计62综合案例综合案例王婆卖瓜问题王婆卖瓜问题 l王婆卖瓜,每卖一个瓜要记录该瓜的重量,还要记录所王婆卖瓜,每卖一个瓜要记录该瓜的重量,还要记录所卖出的总重量和总个数。卖出的总重量和总个数。l西瓜类设计三个数据成员:西瓜类设计三个数据成员: weightweight是一个西瓜的重量,它属于某个西瓜的是一个西瓜的重量,它属于某个西瓜的 total_weighttotal_weight和和total_numbertotal_num

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论