面向对象程序设计辅导四.doc_第1页
面向对象程序设计辅导四.doc_第2页
面向对象程序设计辅导四.doc_第3页
面向对象程序设计辅导四.doc_第4页
面向对象程序设计辅导四.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

湖南电大教学指导中心面向对象程序设计辅导四第六章 简单程序设计学习要点:一个真正的C+程序是由多个文件组成的。在开发的过程中,会形成多个程序文件和多个头文件。多文件结构可以提高程序的可读性、提高程序的开发效率。学习要求:理解多文件结构,能在程序设计中合理利用多文件来进行模块划分。能正确使用外部存储类型和静态存储类型。理解编译预处理的概念,能在程序中合理使用#include预处理指令,看懂#define、#if、#ifndef、#else、#undef、#elif等指令。理解标识符的三种生命期:静态、局部和动态生命期,能指出给定程序中标识符的生命期。能综合运用头文件、外部变量、静态变量来组织多文件结构的程序。学习方法引导:从多文件结构入手,学习如何编制C+程序,理解C+程序的整体结构。掌握几个重要概念。结合实例来理解一个由多文件组成的程序的开发过程。学习内容:我们知道,用VC设计软件时首先要建立一个工程文件,在这个工程文件中指定了该工程用到的所有文件,这其中包含了所有C+程序文件。C+程序是由许多函数组成的,函数是由语句组成的。如下图所示。包含main函数的主文件:main函数是程序的入口,每个工程只有一个main函数。C+程序文件(.cpp)其他程序文件函数工程资源文件类库自定义包含文件。在设计程序时,需要定义大量标识符,对标识符的操作是程序设计的关键。标识符一经定义就有了其作用范围,它在某些范围内是可见的,并不是定义之后都能使用。特别是在多文件结构中,标识符的作用范围除了块级、函数级、还包括文件级和程序级;全局变量不再只是文件级变量,而又分为外部变量和静态全局变量;函数则又分为外部函数和静态函数等。因此在设计多文件结构的C+程序时,有着比单文件结构更复杂的特性。一、多文件结构在设计大型系统时,一般都由多个程序设计人员合作完成,每个程序员完成一部分程序,并以文件的形式存储起来,这样一个工程就包含多个程序文件。C+支持多文件结构,即允许一个工程文件中建立多个程序文件。多文件结构与单文件有比较大的区别。在多文件结构中,除了全局变量、局部变量之外还包括:外部变量、静态全局变量、外部函数、内部函数(静态函数)等特殊函数的标识符。二、文件之间的信息共享(一)外部存储类型全局变量是指作用在整个程序中的变量,也就是作用在程序的每一个C+源文件。前面讲过只要在函数外定义的变量即为全局变量,但并不是说全局变量在每个文件中都是可见的,当用非当前文件内部定义的全局变量时就需要对该全局变量先进行说明,因此这种变量被称为外部变量。除了外部变量之外,同样还有外部函数。外部函数就是不在本文件中定义的函数。外部变量和外部函数因为在外部文件中定义和分配存储空间,因此外部变量和外部函数统称为外部存储类型。外部存储类型在外部文件中定义,那么怎样才能访问外部变量和外部函数呢?。1.访问外部变量C+中通过声明数据和变量为extern(外部的) 来引用外部定义的变量。例611 下面两个文件同属于一个工程,指出下面程序的运行结果。/excpp1.cpp#include int a;int func(int,int);void main( ) int x,y=3; x=y - +a; coutfunc(x,y) ; couta x yendl; /excpp2.cpp文件extern int a;int func (int x,int y) x+; y+=a+; return x+y;答:输出结果为7 2 2 3说明: 文件excpp2.cpp中使用的变量a被声明为外部变量,它是excpp1.cpp中定义的全局变量。若要在程序中使用其他文件中定义的全局变量,则必须在程序中将其做外部声明。带extern的变量说明被称为外部声明,它不同以变量定义,因为被外部声明的变量并不在该文件中分配空间。因此不能将每个文件中使用的同一个变量都声明为外部变量,必须有一个变量应被定义,否则编译将会出错。 被声明为外部的变量其类型必须与该变量的定义一致。2、访问外部函数默认情况下,函数声明或定义后总是被认为是外部的,因此,在每个文件中都可以调用其他文件中定义的函数。因此不特意称函数为外部函数。(二)静态存储类型有时在某文件中定义了一个全局变量,可是又不想让其他文件对该变量访问,这种全局变量就称为内部变量(注意与局部变量的区别)。同样的除了内部变量外还允许定义只在文件中起作用的内部函数。内部变量和内部函数因其定义在文件内部且只能在文件内部被访问,因此被称为静态存储类型,内部变量也称为静态全局变量,内部函数又称为静态函数。1.静态全局变量在全局变量前加上关键字static,该全局变量就成为静态全局变量。特点:静态全局变量只在定义该变量文件的所有程序中是可见的。例621 下面的三个文件同属于一个工程文件,指出下面程序的执行结果。/cpp1.cpp#include int n; void func1( ); void main( ) n=10; coutnendl; func1( ); /cpp2.cpp #include static int n; void func2( ); void func1( ) n+; func2( ); coutnendl; /cpp3.cpp #include extern int n; void func2( ) n+; coutnendl; 运行结果:10111使用静态全局变量的优点是:当许多程序员分工协作开发项目时,为了避免使用了相同的全局变量而影响到程序的正确性,可以定义成静态全局变量。2.静态函数由于函数默认都是全局的,在其他程序中都可以调用(先要声明),但为了防止同名又不同功能的函数出现引起错误的函数调用,有时需将某些函数定义为文件内部可见的即内部函数。内部函数也称静态函数。定义静态函数与定义静态全局变量一样,在函数原型或定义时在类型前面加关键字static即可。例622 下面三个文件同属一个工程文件,指出程序的运行结果。/file1.cpp#include void printnum(int);void getnum( );int a=10;void main ( ) getnum( ); printnum(a);/file2.cpp#include static void printnum(int);static int a;void getnum( ) a+; printnum(a);void printnum(int x) cout”x=”xendl;/file3.cpp#include void printnum(int a) couta;答:输出结果如下x=110(三)作用域作用域又称作用范围。在程序中出现的各种标识符,他们的作用域是不同的。标识符只能在说明它或定义它的范围可见,而在该范围之外是不可见的。标识符的作用域一般分为五大类,分别是:程序级:整个程序可见 文件级:只在某个C+程序文件中可见函数级:只在某函数中可见块级:只在某语句块中可见其他:只在某特殊范围内可见,如函数原型中参数、类成员等1.局部作用域(块级)若标识符的声明出现在有一对华括号扩起来的一段程序内时,该标识符的作用域从声明点开始,到块结束处为止。如局部变量、块内变量。例641指出下面程序中每个变量的作用域#include void main( ) int sum=0; for (int i=1;i=100;i+) sum=sum+i; coutsumendl;在这个程序中,sum和i都是局部变量,sum的作用域从定义开始到函数结束;i的作用域在for语句内。例642指出下面程序中的错误#include void main( )double sum;for (int i=1;is;if (sum50)int x=1;elsedouble x=0.0;sum+=x;coutsumendl;答:有两个错误,一是sum未初始化;另外,因为变量x的作用域在if语句中,语句“sum+=x;”中x没有定义,因此是不正确的。例643指出下面程序的运行结果#include void main( )double sum;for (int i=1;i=10;i+)int x=1;if (i%2=0)int x=-1;sum+=x;coutsumendl;答:结果为10说明:由于程序中的两个x不是同一个变量,它们的作用范围也是不一样的,条件语句中声明的x屏蔽了外面x,即语句x=-1并不影响外面的x的值,因此语句sum+=x中x一直为1。关于这一点请参见6标识符的可见性。2.函数作用域函数作用域就是在整个函数内都起作用,主要包括两类:一类是函数定义时参数表中的参数标识符,参数标识符在整个函数中都可见;另一个是标号,函数内的标号可在函数内的任何位置被goto语句使用。例644指出下面程序的运行结果#include void main( )int sum,i=1;bg: if (i30)goto end;goto bg;end:couti sumendl;答:输出936这里bg和end两个标号在函数main中的任何位置都可以被引用。说明:因为局部变量是从其定义位置开始起作用,只在块内或局部可见,并且在内部还可定义同名局部变量。因此,局部变量不具有函数作用域。3.函数原型作用域函数原型作用域指函数原型中的参数的作用域,参数标识符的作用域开始于函数参数表的做括号,结束于参数表的有括号。即只在参数表中起作用。例如:函数原型“int max(int a, int b);”中a和b只在参数表中起作用,因此其他地方不能引用该标识符。由于函数原型中的参数不能在任何其他地方被引用,所以定义函数原型中的标识符也就没有意义,因此这些参数标识符可以省略,但类型说明不能省。另外要注意:函数原型与函数定义是不一样的,在函数定义中的参数其作用域在整个函数中起作用。4.文件作用域文件作用域就是在某个文件或整个程序中起作用,具有文件作用域的标识符都是在函数外声明和定义的。主要是全局变量、静态全局变量、全局常量、函数、静态函数等。例645指出下面程序中变量的作用域类型及程序中错误int number;static int value;void main( );a=1;number=0;value=number+1;int a;上面程序中定义了三个变量,number和value是文件作用域变量,a是局部作用域变量。程序中由于变量a现实用后定义,因此在编译时就会出错。问题:1、具有文件作用域的标识符是否在程序的所有位置可见?为什么?2、具有局部作用域的标识符是否在块内都可见?为什么?5 可见性可见性指标识符是否能被引用,即是否起作用。可见性与作用域的含义是一致的,是对同一个问题的不同表示方法。三、头文件编程序一般都要用到头文件,头文件可以是系统提供的,也可以是自己定义的。看下面的例子。例651 下面程序是由多个文件组成的,看下面程序的运行结果。/myarea.hdouble circle(double radius);double rect(double width,double length);/mycircle.cpp#include “myarea.h”const double pi=3.14;double circle(double radius)return pi*radius*radius;/myrect.cpp#include “myarea.h”double rect(double width,double length)return width*length;/main.cpp#include #include “myarea.h”void main( )double width,length;coutwidthlength;cout”area of rectangle is”rect(width,length)endl;double radius;coutradius;cout”area of circle is”circle(radius)endl;运行结果为:please enter two sides of rectangle:23.6 4.8113.28area of rectangle is 11please enter a radius:2.1area of circle is 13.8474自己定义头文件时要注意定义和声明的数据的合理性,头文件一般包含公共信息(全局使用),私有数据(局部使用)不能放在头文件中定义和声明。下面给出程序中可能出现的定义和声明。类型声明,如:enum color . 函数声明,如:int fn( );内联函数定义,如:inline void fn( ) . 全局常量定义,如:const double pi=3.14;全局变量声明,如:extern int n;包含指令,如:include 宏定义,如:define Case break;case /Case 用break;case代替另外:一般头文件不宜包含:函数定义,数据定义,如普通变量、数组变量等常量聚集定义(数组常量) 四、生命期生命期就是生存期,生命期与存储空间的存在有关。随着空间的分配而开始,随着空间被系统收回而终止。根据存储空间所在的区域不同分为静态生命期(存储在全局数据区)、局部生命期(存储在栈区)、动态生命期(存储在堆区)。生命期与作用域和可见性

温馨提示

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

评论

0/150

提交评论