C++面向对象程序设计课件第三章 C++程序的结构_第1页
C++面向对象程序设计课件第三章 C++程序的结构_第2页
C++面向对象程序设计课件第三章 C++程序的结构_第3页
C++面向对象程序设计课件第三章 C++程序的结构_第4页
C++面向对象程序设计课件第三章 C++程序的结构_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

18十二月2023C++面向对象程序设计第三章

C++程序的结构3.1作用域和可见性3.2生存期3.3变量的存储类型3.4编译预处理和多文件结构项目设计2预处理及多文件结构18十二月2023C++面向对象程序设计3.1作用域和可见性3.1.1作用域3.1.2可见性18十二月2023C++面向对象程序设计3.1.1作用域作用域是标识符在程序中有效的范围块作用域当标识符的声明出现在由一对大括号所括起来的一段程序(块)内时,该标识符的作用域从声明点开始,到块结束的大括号处为止,该作用域的范围具有局部性。例如,如下代码:

voidfun(inta)//a的作用域起始处{ intb=1;//b的作用域起始处

18十二月2023C++面向对象程序设计3.1.1作用域函数原型作用域函数原型作用域指的是在声明函数原型所指定的参数标识符的作用范围。if(a>b) { intc;//c的作用域起始处

c=a-b; cout<<c; ... }//c的作用域终止处}//a和b的作用域终止处18十二月2023C++面向对象程序设计3.1.1作用域这个作用范围是在函数原型声明中的左、右括号之间。函数作用域在C++语言中,只有goto语句中的标号标识符具有函数作用域。由于goto语句的滥用导致程序流程无规则、可读性差。因此现代程序设计方法不主张使用goto语句。文件作用域文件作用域是在所有函数定义之外声明的,其作用域从声明之处开始,直到文件结束。18十二月2023C++面向对象程序设计3.1.2可见性可见性是从对标识符的引用的角度来谈的概念。如果标识符在某处可见,则就可以在该处引用此标识符。程序运行到某一点能够引用到的标识符就是该处可见的标识符。作用域指的是标识符有效的范围,而可见性是分析在某一位置标识符的有效性。18十二月2023C++面向对象程序设计3.1.2可见性作用域可见性的一般规则是:标识符应声明在前,引用在后。在同一作用域中,不能声明同名的标识符。在没有互相包含关系的不同的作用域中声明的同名标识符互不影响。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。18十二月2023C++面向对象程序设计3.1.2可见性作用域与可见性实例:#include<iostream>usingnamespacestd;inti; //变量i具有文件作用域voidmain(){ i=5; //文件作用域的i赋初值

{ //子块1 inti;//变量i具有块作用域

i=7; cout<<"i="<<i<<endl;//输出7 } cout<<"i="<<i<<endl;//输出5}18十二月2023C++面向对象程序设计3.2生存期3.2.1静态生存期3.2.2动态生存期18十二月2023C++面向对象程序设计3.2.1静态生存期静态生存期与程序的运行期相同,只要程序一开始运行,这种生命期的变量就存在,当程序结束时,其生命期就结束。具有静态生命期的变量在定义时就分配固定的存储单元,并一直保持不变,直至整个程序结束。如果要在函数内部的块作用域中声明具有静态生存期的变量,则要使用关键字static,例如下列语句声明的变量i便是具有静态生存期的变量,也称为静态变量:staticinti;静态生命期的变量,若无显式初始化,则自动初始化为0。18十二月2023C++面向对象程序设计3.2.2动态生存期在块作用域中声明的变量具有动态生存期,也可称为局部生存期变量。这种变量的生存期开始于程序执行经过其声明点时,而结束于其作用域结束处。具有动态生存期的变量是在程序执行过程中,使用它的时候才分配存储单元,使用完毕就立即释放。18十二月2023C++面向对象程序设计3.2.2动态生存期变量的动态生存期与可见性例子#include<iostream>usingnamespacestd;inti=1; //i具有文件作用域和静态生存期voidmain(void){//a具有块作用域和静态生存期,局部可见。staticinta;

intb=-10; //b,c具有块作用域和动态生存期。

intc=0;voidother(void);cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;

18十二月2023C++面向对象程序设计3.2.2动态生存期

c=c+8;other();cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;i=i+10;other();}voidother(void){staticinta=2;staticintb;//a,b具有块作用域和静态生存期,局部可见

//只在第一次进入函数时被初始化。

18十二月2023C++面向对象程序设计3.2.2动态生存期intc=10;//C具有块作用域和动态生存期

//每次进入函数时都初始化。

a=a+2;i=i+32;c=c+5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;b=a;}18十二月2023C++面向对象程序设计3.3变量的存储类型3.3.1局部变量3.3.2全局变量3.3.3外部变量18十二月2023C++面向对象程序设计3.3.1局部变量具有块作用域的变量称为局部变量。一般说来,用自动存储类型(auto)声明的变量都是限制在某个程序范围内使用的,即为局部变量。使用关键字register声明寄存器类型的变量的目的是将所声明的变量放入寄存器内,从而加快程序的运行速度。静态类型(static)变量也是一种局部变量。它和自动存储类型变量的最大不同之处在于:静态存储类型变量在内存中是以固定地址存放的,而不是以堆栈方式存放的。18十二月2023C++面向对象程序设计3.3.1局部变量在C++语言中,声明局部变量的时候加上关键字static就构成了静态局部变量。局部变量实例参见教材[例3-3]18十二月2023C++面向对象程序设计3.3.2全局变量具有文件作用域的变量称为全局变量。在程序中声明的全局变量总是静态存储类型,若在全局变量前加上static,使该变量只在这个源程序文件内使用,称为全局静态存储变量或静态存储全局变量。全局变量实例参见教材[例3-4]18十二月2023C++面向对象程序设计3.3.3外部变量使用关键字extern声明的变量称为外部变量。一般是指定义在本程序外部的变量。extern定义符的作用是将全局变量的作用域延伸到其它源程序文件。在C++中,只有在两种情况下要使用外部变量。第一种情况是在同一个源程序文件中,若定义的变量使用在前,声明在后,这时在使用前要声明为外部变量。(参见教材[例3-5])第二种情况,当由多个源文件组成一个完整的程序时,在一个源程序文件中完全定义的变量要被其他若干个源文件引用时,引用的文件中要使用extern声明外部变量。(参见教材[例3-6])18十二月2023C++面向对象程序设计3.4编译预处理和多文件结构3.4.1编译预处理命令3.4.2多文件组织结构18十二月2023C++面向对象程序设计3.4.1编译预处理命令预处理程序又称预处理器,它包含在编译器中。编译器在对源程序进行编译之前,首先要由预处理程序对程序文本进行预处理,把源代码转化成包含机器语言指令的目标文件。宏定义指令#define和#undef在程序中可用#define来定义一个符号常量,例如:#definePI3.1415926#define还可以定义带参数的宏,例如:#difineMIN(x,y)((x)<(y)?(x):(y))18十二月2023C++面向对象程序设计3.4.1编译预处理命令#undef的作用是删除由#define定义的宏,使之不再起作用。文件包含指令#include所谓“文件包含”是指将另一个源文件嵌入到当前源文件中该点处。文件包含指令有两种格式:#include<文件名>这种格式用于嵌入C++提供的头文件。这些头文件一般位于C++系统目录的include子目录下。#include"文件名"预处理器遇到这种格式的包含指令后,首先在当前文件所在目录中进行搜索,如果找不到,再按标准方式搜索。这种方式适合于规定用户自己建立的头文件。18十二月2023C++面向对象程序设计3.4.1编译预处理命令条件编译指令一般情况下,源程序中所有的语句都参加编译,但有时也希望根据一定的条件去编译源文件的不同部分,这就是“条件编译”。C++提供的条件编译语句有下列几种常用的形式:

#if形式#if<表达式>//当表达式值为真(非零)时编译程序段1<程序段1>[#else//当表达式值为假(零)时编译程序段2<程序段2>]#endif18十二月2023C++面向对象程序设计3.4.1编译预处理命令#ifdef形式或#ifndef形式#ifdef(或#ifndef)<标识符><程序段1>[#else<程序段2>]#endif#if-#elif形式#if<表达式1>//当表达式1值为真(非零)时编译程序段1<程序段1>[#elif<表达式2>//当表达式1值为假、表达式2值为真时编译程序段2<程序段2>…[#elif<表达式n><程序段n>]//当表达式1、…表达式n-1值均为假,表达式n值为真时编译程序段n[#else<程序段n+1>]//其他情况下编译程序段n-1#endif

18十二月2023C++面向对象程序设计3.4.1编译预处理命令编译预处理命令实例参见教材[例3-7]18十二月2023C++面向对象程序设计3.4.2多文件组织结构在实际的程序设计中,一个程序通常由多个头文件和源文件组成,每个源文件是一个可编译的程序单位,头文件起着源文件之间接口的作用。从下面的程序开发示意图来看看多文件的组织结构:18十二月2023C++面向对象程序设计3.4.2多文件组织结构18十二月2023C++面向对象程序设计3.4.2多文件组织结构图中,源文件中含有包含头文件的预编译语句,经过预编译后,产生翻译单元,然后编译,进行语法检查,产生目标文件(.obj)。若干个目标文件经过连接,产生可执行文件(.exe)。多文件组织结构实例参见[例3-8]

18十二月2023C++面向对象程序设计项目设计2预处理及多文件结构设计题目预处理及多文件结构设计概要要求掌握多文件C++程序的编码方法和预处理的使用。系统分析书写头文件时应该遵循的几点规则:为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。18十二月2023C++面向对象程序设计项目设计2预处理及多文件结构用#include<filename.h>格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。用#includee”filename.h”格式来引用非标准库的头文件(编

温馨提示

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

评论

0/150

提交评论