面向对象的设计与分析课件.ppt

上传人:桔**** 文档编号:567914632 上传时间:2024-07-22 格式:PPT 页数:83 大小:512.50KB
返回 下载 相关 举报
面向对象的设计与分析课件.ppt_第1页
第1页 / 共83页
面向对象的设计与分析课件.ppt_第2页
第2页 / 共83页
面向对象的设计与分析课件.ppt_第3页
第3页 / 共83页
面向对象的设计与分析课件.ppt_第4页
第4页 / 共83页
面向对象的设计与分析课件.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《面向对象的设计与分析课件.ppt》由会员分享,可在线阅读,更多相关《面向对象的设计与分析课件.ppt(83页珍藏版)》请在金锄头文库上搜索。

1、第第2 2章章 C+语言基础语言基础n本章的学习目的本章的学习目的 面向对象技术的思想方法最早起源于面向面向对象技术的思想方法最早起源于面向对象编程语言。最典型和流行的面向对象编对象编程语言。最典型和流行的面向对象编程语言程语言C+C+提供了支持面向对象技术的最充分提供了支持面向对象技术的最充分的机制。因此通过学习的机制。因此通过学习C+C+,我们能够获得对,我们能够获得对面向对象的基本概念和思想方法的深刻理解。面向对象的基本概念和思想方法的深刻理解。所以在初步了解面向对象的基本概念和思想所以在初步了解面向对象的基本概念和思想方法的基础上,有必要先学习一下方法的基础上,有必要先学习一下C+C+

2、,以加,以加深对面向对象的基本概念和思想方法的理解,深对面向对象的基本概念和思想方法的理解,为进一步学习面向对象的系统分析和设计作为进一步学习面向对象的系统分析和设计作好充分准备。好充分准备。n本章的学习内容本章的学习内容l了解了解C+程序基本结构程序基本结构l了解了解C+数据类型、运算符及表达式数据类型、运算符及表达式 l了解和掌握程序流程控制基本语句了解和掌握程序流程控制基本语句l了解和掌握函数的定义和调用方法了解和掌握函数的定义和调用方法2.1 C+2.1 C+程序的基本结构程序的基本结构2.1.1 C+2.1.1 C+程序示例程序示例【例例2.1】 一个简单的一个简单的C+程序程序 /

3、 输入一个学生的三门课成绩,计算其加权平均值输入一个学生的三门课成绩,计算其加权平均值#include /预处理指令预处理指令 /子函数的引用说明子函数的引用说明double Average(double score1, double score2, double score3);void main() /程序的主函数程序的主函数 double score1, score2, score3, average; coutscore1; /接受用户输入接受用户输入 coutscore2; coutscore3;/调用子函数,用返回值为变量赋值调用子函数,用返回值为变量赋值average = Ave

4、rage(score1, score2, score3);cout加权平均分为:加权平均分为:averagen; /输出计算结果输出计算结果/ 程序的子函数定义程序的子函数定义double Average(double score1, double score2, double score3) double credit1, credit2, credit3, average; /定义四个双精度型变量定义四个双精度型变量 credit1 = 3.0; /给变量赋值给变量赋值credit2 = 4.0;credit3 = 2.0;average = (credit1*score1+credit2

5、*score2+credit3*score3)/(credit1+credit2+credit3); /计算表达式的值,并赋给变量计算表达式的值,并赋给变量return average; /将变量的值作为函数的返回值,返回给调用者将变量的值作为函数的返回值,返回给调用者 2.1.2 C+程序的一般结构程序的一般结构 一个一个C+C+程序由一个或多个程序由一个或多个源代码文件源代码文件构成。构成。C+C+的源代的源代码文件分为两类码文件分为两类:头文件头文件(.h).h)和和源程序文件(源程序文件(. .cppcpp) )。 C+C+源代码文件一般可以分源代码文件一般可以分成四个部分:预处理指令

6、、全成四个部分:预处理指令、全局说明(包括对象类的定义)、局说明(包括对象类的定义)、程序的主函数和用户自定义的程序的主函数和用户自定义的子函数,如右图所示。下面分子函数,如右图所示。下面分别对这几个部分进行讨论。别对这几个部分进行讨论。1.1.预处理命令预处理命令 在在C+C+程序中程序中, ,以以 # #开头的命令开头的命令叫预处理命令叫预处理命令。它们指示编译器。它们指示编译器在对程序正式编译前对程序进行适当处理,将必要的信息包含在对程序正式编译前对程序进行适当处理,将必要的信息包含进来,然后再对程序进行正式的编译处理。进来,然后再对程序进行正式的编译处理。 常用的预处理命令有三类:常用

7、的预处理命令有三类:(1 1)预处理包含命令)预处理包含命令#include#include #include#include指令是最为常用的预处理指令。在程序执行的过程中,指令是最为常用的预处理指令。在程序执行的过程中,我们经常要使用到某种编译系统提供的标准函数或我们经常要使用到某种编译系统提供的标准函数或类库提供的类库提供的类类或用户开发的、存放在其他文件中的类、结构、变量、函数或用户开发的、存放在其他文件中的类、结构、变量、函数等。而这些类、结构、变量、函数等的说明和其他信息,都保等。而这些类、结构、变量、函数等的说明和其他信息,都保存在相关的存在相关的头文件(头文件(.h.h文件)文件

8、)中。为了使用这些中。为了使用这些头文件头文件中定义中定义的类、结构、变量和函数,必须将相应的的类、结构、变量和函数,必须将相应的头文件头文件包含到要使用包含到要使用它们的源程序中。它们的源程序中。 例如例如 #include #include #include #include (2) (2) 条件预处理指令条件预处理指令 由于被预处理包含指令由于被预处理包含指令#include#include所指定的头文件所指定的头文件中也可以使用中也可以使用#include#include指令包含别的头文件,因此就指令包含别的头文件,因此就可能出现头文件嵌套包含甚至是头文件循环相互调用可能出现头文件嵌套

9、包含甚至是头文件循环相互调用的情况,导致编译效率低下甚至是编译失败的情况。的情况,导致编译效率低下甚至是编译失败的情况。 例如例如 /myheadfile1.h #include myheadfile2.h / /myheadfile2.h #include myheadfile1.h 为了避免上述情况的发生,引入了为了避免上述情况的发生,引入了条件预处条件预处理指令理指令,用来判断是否已经包含了某个头函,用来判断是否已经包含了某个头函数或头函数的某个部分,若已经包含了某个数或头函数的某个部分,若已经包含了某个头函数或头函数的某个部分,则在以后遇到头函数或头函数的某个部分,则在以后遇到要求再包

10、含该头函数或头函数的该部分时,要求再包含该头函数或头函数的该部分时,跳过包含指令跳过包含指令#include#include ,以避免头文件重复,以避免头文件重复包含或循环调用的情况。条件预处理指令包包含或循环调用的情况。条件预处理指令包括:括: # #ifdefifdef # #ifndefifndef #else # #else #endifendif #define#define【例例2.2】 条件预处理指令条件预处理指令#ifndef的用法的用法 / myheadfile.h #ifndef MYHEADFILE_H #define MYHEADFILE_H /*加入头文件代码加入头文

11、件代码 */ #endif /* MYHEADFILE_H */ 在头文件在头文件myheadfile.h中加入了上述条件预处理指令后,中加入了上述条件预处理指令后,在任何包含该头文件的源程序中,该头文件都不会被重复包含。在任何包含该头文件的源程序中,该头文件都不会被重复包含。 例如例如 /P1.CPP#include myheadfile.h#include myheadfile.h 条件预处理指令条件预处理指令# #ifdefifdef与与# #ifndefifndef正好相反,当其后面的标识正好相反,当其后面的标识符已被定义时,条件判断为真,符已被定义时,条件判断为真,# #ifdefi

12、fdef和其对应的和其对应的# #endifendif之之间的语句将被执行;而当该标识符未被定义时,编译器将跳间的语句将被执行;而当该标识符未被定义时,编译器将跳过这部分语句。我们再来看一个例子:过这部分语句。我们再来看一个例子: 【例例2.32.3】 条件预处理指令用法举例条件预处理指令用法举例 # #ifdefifdef u362 u362 /* /* 此处为专门为此处为专门为AT&T 3BAT&T 3B计算机指定的代码计算机指定的代码 * */ / # #endifendif /* u362 */ /* u362 */# #ifdefifdef sun sun /* /* 此处为专门为此

13、处为专门为SunSun计算机指定的代码计算机指定的代码 * */ / # #endifendif /* sun */ /* sun */ 【例例2.4】 条件预处理指令条件预处理指令#else的用法的用法 #ifdef _cplusplus /* 专门为专门为C+语言指定的代码语言指定的代码 */ #else /* 专门为专门为C语言指定的代码语言指定的代码 */ #endif /* _cplusplus */ (3)(3)宏替换命令宏替换命令 #define#define使用宏替换指令主要是为了简化代码和增强程序使用宏替换指令主要是为了简化代码和增强程序的可读性。的可读性。C+中的宏替换主要

14、有两种使用形式。中的宏替换主要有两种使用形式。形式形式1:#define标识符标识符所代表的常量所代表的常量(如:如:#definePI3.14159265#defineMX+Y或或#defineMZ)形式形式2:#define标识符标识符(参数参数)表达式表达式(如:(如:#defineArea(r)PI*r*r)2.2.全局说明全局说明 全局说明一般包括程序所要使用的数据类型的定义、类的定义或说明、全局说明一般包括程序所要使用的数据类型的定义、类的定义或说明、全局变量的定义或说明、用户自定义函数的原型声明等。例如,全局变量的定义或说明、用户自定义函数的原型声明等。例如,#include #

15、include typedef struct date /定义日期结构体,年、月、日定义日期结构体,年、月、日 int year;int month;int day; date; date D;class person/定义定义person基类基类public: char name10; char sex10;char address100;virtual void Show(); ;double Average(double score1, double score2, double score3);3. 3. 主函数主函数 任何一个任何一个C+C+程序都有一个且只能有一个主程序都有一个且只

16、能有一个主函数。通常主函数的名称为函数。通常主函数的名称为main()main() 。主函数。主函数是是C+C+程序的总控程序。程序的总控程序。 C+C+程序的执行从主程序的执行从主函数开头进入,从主函数结尾返回。例如函数开头进入,从主函数结尾返回。例如 /P3.CPP/P3.CPP #include #include #include #include void main() void main() ; ; 4.用户自定义的函数用户自定义的函数 用户自定义的函数是程序开发人员为了实现某些特定的功能用户自定义的函数是程序开发人员为了实现某些特定的功能操作而编写的一段代码。当然,程序员也可以不使

17、用任何子函操作而编写的一段代码。当然,程序员也可以不使用任何子函数,而将全部代码放在主函数中。但是,有目的地把某些代码数,而将全部代码放在主函数中。但是,有目的地把某些代码段独立出来,组织成子函数的形式,将能简化代码,避免同段独立出来,组织成子函数的形式,将能简化代码,避免同 样代码的多次重复书写,而且使得程序更加清晰易读、各部分样代码的多次重复书写,而且使得程序更加清晰易读、各部分代码功能目的明确。代码功能目的明确。 #include int SUM(int n) int i,s; for (i=1;i=n;i+) s=s+i; return s; main() SUM(100); SUM(

18、200); 2.2 数据类型、运算符和表达式数据类型、运算符和表达式2.2.1 基本数据类型基本数据类型C+的基本数据类型有的基本数据类型有:l整型整型(int);l字符型字符型(char);l浮点型浮点型(float/double);l布尔型布尔型(bool);定义基本类型变量时,可使用定义基本类型变量时,可使用符号属性符号属性 signed, unsigned长度属性长度属性 short, long 类类型型字字长长表示范围表示范围char 8-128127signedchar8-128127unsignedchar 80255int16 -3276832767unsignedint16

19、-3276832767signedint 16 065535shortint16 -3276832767(1)表表2.1基本数据类型的字长和表示范围基本数据类型的字长和表示范围unsignedshortint16065535signedshortint16-3276832767longint32-21474836482147483647unsignedlongint 32-21474836482147483647signedlongint3204294967295float 323.4e-383.4e+38double641.7e-3081.7e+308longdouble1283.4e-49

20、323.4e+4932表表2.1基本数据类型的字长和表示范围基本数据类型的字长和表示范围(续续)(2) (2) 常量常量n定义:在程序运行过程中,值不能被改变的定义:在程序运行过程中,值不能被改变的量称为常量,包括常数和代表固定不变值量称为常量,包括常数和代表固定不变值的符号常量。的符号常量。n为了提高程序的可读性,为了提高程序的可读性,C+C+通过给常量命通过给常量命名的方式定义名的方式定义符号常量符号常量,格式如下:,格式如下: const const = 例如,例如,const float pi= 3.1415926const float pi= 3.1415926 C+ C+也可以用编

21、译预处理命令定义常量:也可以用编译预处理命令定义常量: #define pi 3.1415926#define pi 3.1415926(3)变量变量 在程序运行过程中,取值可以被改变的量称在程序运行过程中,取值可以被改变的量称为为变量变量。在。在C+C+中,任何一个变量在使用之前中,任何一个变量在使用之前必须先定义。与必须先定义。与C C语言不同,语言不同,C+C+中的变量可以中的变量可以在程序中使用该变量之前的任何地方定义在程序中使用该变量之前的任何地方定义, ,不不必集中在程序之前的某个地方。定义格式如下:必集中在程序之前的某个地方。定义格式如下: 例如:例如: int i, j, k;

22、 float x, y=3.9, z=0.0; char ch1=a;2.2.2 2.2.2 指针和引用指针和引用(1)指针)指针 指针是专门用来存放指针是专门用来存放其他数据的内存地址其他数据的内存地址的变量。的变量。定义格式为:定义格式为: * 例如:例如: int* iptr; C+提供了一个取得变量地址的运算符提供了一个取得变量地址的运算符&,可用它,可用它取得变量的地址,并将地址存放到指针变量中。其格取得变量的地址,并将地址存放到指针变量中。其格式为:式为: =& 例如:例如: int x; int *ptr=&x; (2 2)引用)引用 引用引用是给某个变量取的别名,因此可用作访问

23、该变量是给某个变量取的别名,因此可用作访问该变量的一种方法。的一种方法。定义定义一个引用时,要用某个变量对其初一个引用时,要用某个变量对其初始化,使它初始时始化,使它初始时就就表示该变量,即绑定在该变量上。表示该变量,即绑定在该变量上。对于引用的改动就等效于对其所绑定的变量的改动,对于引用的改动就等效于对其所绑定的变量的改动,反之亦然。反之亦然。定义定义引用的格式如下:引用的格式如下: & & = 例如:例如: intint a; a; intint& & rara=a;=a; rara=10;=10; coutcoutraraaaendlendl; ; rara=20;=20; coutco

24、utraraaaendlendl; ;2.2.3 2.2.3 数组和结构体数组和结构体1.1.数组的定义数组的定义 数组是一组具有相同类型和相同名字但不同下标的数组是一组具有相同类型和相同名字但不同下标的数据变量(如数据变量(如 A0A0,A1, A1, A100)A100)。 定义数组的一般格式如下定义数组的一般格式如下: 常量表达式常量表达式11常量表达式常量表达式2 ;2 ; 例如例如: : char a10 ; /定义定义1010个元素的字符数组个元素的字符数组a,a, / /包含包含1010个字符变量个字符变量 int ba; /等价于等价于int b97; int element2

25、3 ; /定义一个定义一个2 2行行3 3列的二维数组列的二维数组2.2.数组使用说明数组使用说明(1)(1)数组名是标识符数组名是标识符, ,只能由字母、数字和下划线三种字符只能由字母、数字和下划线三种字符组成,且第一字符必须为字母或下划线。组成,且第一字符必须为字母或下划线。(2)(2)数据元素的下标应小于本维数据元素的下标应小于本维 的值。的值。例如:例如: intint a23; a23; a00=1; (a00=1; () ) a01=2; ( a01=2; () ) a02=3; ( a02=3; () ) a10=4; ( a10=4; () ) a11=5; ( a11=5;

26、() ) a12=5; ( a12=5; () ) a22=6; ( a22=6; (X X) ) a23=7; ( a23=7; (X X) )3.结构体类型的定义格式如下结构体类型的定义格式如下: struct ; ; ; 例如: struct Date int year; int month; int day; 4.结构体变量的定义格式如下结构体变量的定义格式如下: struct 例如: struct Date today,tomorrow;5.结构体的操作运算结构体的操作运算(1)结构体变量成员的操作运算)结构体变量成员的操作运算 访问结构体变量成员有两种表示式:访问结构体变量成员有两

27、种表示式: -例如:例如: struct date day1=2001,12,14; struct date day2,*pd=day1; day2.year=day1.year+1; pd-year= pd-year+1;(2) 结构体变量整体的赋值运算结构体变量整体的赋值运算 day2=day1;(3)不允许将两个结构体变量做整体比较,只不允许将两个结构体变量做整体比较,只能逐个成员比较能逐个成员比较。 例如:例如: if (day1=day2); /错误错误 if (day1.year= day2.year& day1.month= day2.month & day1.day= day2

28、.day) /正确正确 2.2.4 C+中的运算符和表达式中的运算符和表达式 2.2.4.1 C+2.2.4.1 C+中的基本运算符中的基本运算符 n可以将可以将C+C+中的操作符分为:中的操作符分为:算术运算符;算术运算符;关系运算符;关系运算符;逻辑运算符;逻辑运算符;赋值运算符;赋值运算符;条件运算符;条件运算符;自增自减运算符;自增自减运算符;位运算符;位运算符;sizeofsizeof运算符等。运算符等。 1 算术运算符算术运算符表表2.4C+中的算术运算符中的算术运算符 运算符运算符运算操作运算操作使用例子使用例子-取负取负(单目单目)-var+加法加法var1+var2-减法减法

29、(双目双目)var1-var2*乘法乘法var1*var2/除法除法var1/var2%取模取模var1%var22. 关系运算符关系运算符C+C+中有六种关系运算符,如表中有六种关系运算符,如表2.52.5所示,它们所示,它们都是双目运算符。关系运算符的返回值只有逻辑真都是双目运算符。关系运算符的返回值只有逻辑真和逻辑假两种。由于和逻辑假两种。由于C+C+中没有提供逻辑型数据,所中没有提供逻辑型数据,所以关系运算的结果返回一个整型数,并用以关系运算的结果返回一个整型数,并用1 1表示逻辑表示逻辑真,用真,用0 0表示逻辑假。表示逻辑假。表表2.5C+中的关系运算符中的关系运算符运算符运算符运

30、算操作运算操作使用例子使用例子小于小于var1var2=小于等于小于等于var1大于大于var1var2=大于等于大于等于var1=var2=等于等于var1=var2!=不等于不等于var1!=var23. 逻辑运算符逻辑运算符C+中的逻辑运算符共有三个,如表中的逻辑运算符共有三个,如表2.62.6所示。所示。逻辑运算符用来表示操作数的逻辑关系,其运算结果逻辑运算符用来表示操作数的逻辑关系,其运算结果是整型数是整型数0 0或或1 1。逻辑运算的结果也可以作为一个整型。逻辑运算的结果也可以作为一个整型数用在算术运算中。数用在算术运算中。 表表2.6C+中的逻辑运算符中的逻辑运算符 运算符运算符

31、运算操作运算操作使用例子使用例子!逻辑反逻辑反!expr&逻辑与逻辑与expr1&expr2|逻辑或逻辑或expr1|expr224.赋值运算符赋值运算符 赋值运算符赋值运算符“= =”将右边表达式的值赋给左边的变量,将右边表达式的值赋给左边的变量,其结果是将一个新的数值存放在左操作数所占用的内其结果是将一个新的数值存放在左操作数所占用的内存单元中。存单元中。 例如:例如:var1 = var2 = var3 = var4 = 8;var1 = var2 = var3 = var4 = 8;复合运算表达式复合运算表达式等价表达式等价表达式var1+=var2;var1=var1+var2;va

32、r1-=var2;var1=var1-var2;var1*=var2;var1=var1*var2;var1/=var2;var1=var1/var2;var1%=var2;var1=var1%var2;var1=var2;var1=var1=var2;var1=var1var2;var1&=var2;var1=var1&var2;var1=var2;var1=var1var2;var1|=var2;var1=var1|var2;5.条件运算符条件运算符 条件运算符的语法形式如下:条件运算符的语法形式如下: expr1 ? expr2 : expr3;expr1 ? expr2 : expr3

33、;在执行该语句时,先无条件计算表达式在执行该语句时,先无条件计算表达式expr1expr1;若表达式;若表达式expr1expr1的计算结果为真(任意非零值),则计算表达式的计算结果为真(任意非零值),则计算表达式expr2expr2;否则计算表达式;否则计算表达式expr3expr3。6.6.自增、自减运算符自增、自减运算符自增运算符自增运算符+和自减运算符和自减运算符- - -主要用在循环语句中,主要用在循环语句中,为循环控制变量提供格式紧缩的加为循环控制变量提供格式紧缩的加1 1和减和减1 1运算。例如:运算。例如: inti=1,j=10;等价于等价于inti=1,j=10;i+;i=

34、i+1;j-;j=j-1;7.位运算符位运算符 在计算机中,数据是用二进制来进行存储的,在计算机中,数据是用二进制来进行存储的,任何一种类型的数据都可以转化为一定位数的二进制任何一种类型的数据都可以转化为一定位数的二进制符号,即用按一定顺序排列的符号,即用按一定顺序排列的0 0和和1 1表示。表示。C+C+中提供中提供了六个位运算符如表了六个位运算符如表2.72.7所示。所示。 表表2.7C+中的位运算符中的位运算符 运算符运算符运算操作运算操作使用例子使用例子按位取反按位取反var左移左移var1右移右移var1var2&按位与按位与var1&var2按位异或按位异或var1var2|按位或

35、按位或var1|var28.sizeof运算符运算符 sizeofsizeof运算符返回一种数据类型的字节长度运算符返回一种数据类型的字节长度时,格式为:时,格式为: sizeof ( type-specifier ) 如:如:sizeof ( double ) 当需要返回一个变量的字节长度时,可采用如当需要返回一个变量的字节长度时,可采用如下两种形式中的任一种:下两种形式中的任一种: sizeof ( variable ) 如:如:int var; sizeof ( var ); sizeof variable 如:如:int var; sizeof var; 2.2.4.2 2.2.4.2

36、 C+表达式表达式 表达式是由运算符和操作数组成的式子。操作表达式是由运算符和操作数组成的式子。操作数包括常量、变量、函数和其他一些命名的标数包括常量、变量、函数和其他一些命名的标识符。表达式可以分为:识符。表达式可以分为:算术表达式算术表达式 关系表达式关系表达式逻辑表达式逻辑表达式 条件表达式条件表达式赋值表达式赋值表达式 逗号表达式逗号表达式表表2-3 表达式的分类表达式的分类2024/7/22程序运行时需要占用多大的空间需要在编译时确程序运行时需要占用多大的空间需要在编译时确定,便于操作系统为程序分配适当的内存空间。定,便于操作系统为程序分配适当的内存空间。从静态存储区分配从静态存储区

37、分配:程序的全局变量和静态变量:程序的全局变量和静态变量都在这里分配,且在编译时已经分配好,在程序都在这里分配,且在编译时已经分配好,在程序终止前被终止前被操作系统操作系统回收。回收。 在栈上创建:在栈上创建:在函数调用时,函数的形参和局部在函数调用时,函数的形参和局部变量都在栈上创建,函数执行完毕时这些内存自变量都在栈上创建,函数执行完毕时这些内存自动被释放掉。动被释放掉。 从堆从堆( (heap)heap)上分配:上分配:在程序运行期间,用动态存在程序运行期间,用动态存储分配函数申请和释放的内存储分配函数申请和释放的内存程序中变量的内存分配方式2024/7/22由动态内存管理系统管理的这块

38、内存区域叫做由动态内存管理系统管理的这块内存区域叫做“ “堆堆(heap)”(heap)”:当需要动态灵活地分配内存空间时,需要用到动态当需要动态灵活地分配内存空间时,需要用到动态存储分配存储分配动态分配得到的内存块位于堆中,动态分配得到的内存块位于堆中,且没有名字且没有名字动态存储分配由库函数动态存储分配由库函数malloc.hmalloc.h提供提供格式:格式:p = (double* ) p = (double* ) malloc(nmalloc(n* *sizeof(doublesizeof(double)C+C+中动态存储分配由运算符中动态存储分配由运算符newnew和和delete

39、delete实实现现newnew和和deletedelete完成动态存储分配时,完成动态存储分配时,可以很好可以很好地和构造函数、析构函数进行交互地和构造函数、析构函数进行交互,mallocmalloc和和freefree不能自行调用不能自行调用构造函数和析构函数构造函数和析构函数动态存储分配2.2.5 2.2.5 动态存储分配(一)动态存储分配(一)1. new1. new运算符运算符 三种常用格式:三种常用格式:格式格式1 1: =new =new 功能:功能: 分配一块与分配一块与 相适应的存储空间,若相适应的存储空间,若分配成功,将这块内存空间的首地址存入指针分配成功,将这块内存空间的

40、首地址存入指针变量,否则置指针变量的值为变量,否则置指针变量的值为NULLNULL(空指针值,(空指针值,即即0 0)。)。2.2.5 动态存储分配(二)格式格式2 2: =new =new ( )功能:功能: 分配一块与分配一块与 相适应的存储空间,并用相适应的存储空间,并用 为分配好的存储空间置初值。若分配成功,将这块为分配好的存储空间置初值。若分配成功,将这块内存空间的首地址存入指针变量,否则置指针变量内存空间的首地址存入指针变量,否则置指针变量的值为的值为NULLNULL(空指针值,即(空指针值,即0 0)。)。 例如:例如: intint *p; *p; p=new int(100)

41、; p=new int(100); /动态存储分配一个整数单元,并给它赋初值动态存储分配一个整数单元,并给它赋初值100100。2.2.5 2.2.5 动态存储分配(三)动态存储分配(三)格式格式3: =new 功能:功能: 申请大小为申请大小为的数组空间。但创建的数组空间。但创建数组时,不能为该数组指定初始值。数组时,不能为该数组指定初始值。 例如:例如: int *p; p=new int10; /动态分配一个含动态分配一个含 有有10个整数的数组。个整数的数组。2.2.5 2.2.5 动态存储分配(四)动态存储分配(四)1. delete1. delete运算符运算符 二种常用格式:二种

42、常用格式: 格式格式1 1: delete delete 功能:功能: 释放释放 指向的动态存储空间。指向的动态存储空间。 例如:例如: delete p;delete p;2.2.5 2.2.5 动态存储分配(五)动态存储分配(五)格式格式2 2: delete delete 功能:功能: 用于释放数组占用的动态存储空间。用于释放数组占用的动态存储空间。 例如:例如: intint *p; *p; p=new int10; p=new int10; delete p; delete p;例例2-7 用用new申请数组空间申请数组空间 #include #include void main()

43、 int* array; if (array=new int10)=NULL) cout“Cant allocate memory, terminating”; exit(1); for (int count=0;count10;count+) arraycount=count*2; coutarraycount“ ”; couty) (xy) coutcoutx x elseelse coutcouty y (4)(4)循环语句循环语句。 例如,例如,for(nfor(n=1;n100;n+) s=1;n100;n+) s=s+ns+n; ;(5)(5)跳转语句跳转语句。例如,。例如,bre

44、akbreak(6)(6)复合语句复合语句。switch(chr) case s: cout“* 您选择的是学生信息:您选择的是学生信息:”n; break; case t: cout“* 您选择的是教师信息您选择的是教师信息:”x1; x2=average(90,80,70)+x1;x1; x2=average(90,80,70)+x1; printf(“%d”,x2); printf(“%d”,x2); 2 2分支结构分支结构按照条件判断有选择地执行某个程按照条件判断有选择地执行某个程序段的语句。序段的语句。 例如,例如,ifif (xy) (xy) coutcoutx x else el

45、se coutcouty y 3 3循环结构循环结构控制某程序段重复执行的语句。控制某程序段重复执行的语句。 例如,例如, forfor(n(n=1;n100;n+) s=1;n100;n+) s=s+ns+n; ;2.3.1 if 条件分支语句条件分支语句 if if 语句又有三种形式:单分支语句又有三种形式:单分支ifif语句、双分支语句、双分支ifif语句、多分支语句、多分支ifif语句。语句。n单分支单分支ifif语句的格式:语句的格式: if (if ( ) 例如:例如: if (xy) if (xy) coutcoutx;x;n双分支双分支ifif语句的格式:语句的格式: if (

46、if ( ) 1 else else 2例如:例如:if (xy) coutxendl; else coutyendl;n多分支if语句的格式 if (if (1) 1 else if ( else if (2) 2 else if ( else if (n) n else else n+12.3.2 2.3.2 switch开关分支语句开关分支语句 Switch开关分支语句的语法结构如下所示:开关分支语句的语法结构如下所示: switch ( variable )case const1: statement1-1; . . statement1-n;case const2: statemen

47、t2-1; . . statement2-n;case const3: statement3-1; . . statement3-n;. .default: statementm-1; . . statementm-n; switch语句的另一种格式语句的另一种格式: switch ( variable )case const1: statement1-1; . . break;case const2: statement2-1; . . break; case const3: statement3-1; . . break;. .default: statementm-1; . . stat

48、ementm-n; 2.5.3 循环控制语句循环控制语句C+C+提供了三种循环控制语句:提供了三种循环控制语句:whilewhile循环控制语句、循环控制语句、dodo循环控制语句和循环控制语句和forfor循环控制语句。循环控制语句。1.1.whilewhile循环控制语句循环控制语句 while while循环控制语句的语法结构如下所示:循环控制语句的语法结构如下所示: while ( expression ) while ( expression ) ; ; 2. do-while2. do-while循环控制语句循环控制语句 do do ; ; while ( expression )

49、; while ( expression ); 3. for3. for循环控制语句循环控制语句 for (for (1; 2; 3) ;2.3.4 跳转控制语句跳转控制语句 跳转控制语句用于改变正常的程序执行流程,跳转控制语句用于改变正常的程序执行流程,实现控制转移。常用的跳转控制语句有实现控制转移。常用的跳转控制语句有breakbreak、continuecontinue等等, ,下面将分别进行介绍。下面将分别进行介绍。 1.break1.break跳转控制语句跳转控制语句 breakbreak跳转控制语句常用于跳转控制语句常用于循环控制语句循环控制语句和和开关分支语句开关分支语句中,用于

50、终止当前层的中,用于终止当前层的whilewhile、dodo、forfor循环或循环或switchswitch流程的执行。当程序在流程的执行。当程序在循环体内或分支语句内遇到循环体内或分支语句内遇到breakbreak语句时,循语句时,循环或分支语句的执行立即中断,并转向本层循环或分支语句的执行立即中断,并转向本层循环体外或分支语句外的下一条语句执行。环体外或分支语句外的下一条语句执行。 【例例2.8】break跳转控制语句用法跳转控制语句用法 #include /预处理包含语句预处理包含语句void main()/程序的主函数程序的主函数 bool pt = true;/定义布尔型变量定义

51、布尔型变量pt,并为其赋初值,并为其赋初值 char chr; /定义字符型变量定义字符型变量chr while (pt) /while循环循环 coutchr;/输入选择字符输入选择字符 switch(chr)/switch开关控制开关控制 case s:/当选择学生信息时当选择学生信息时 cout“* 您选择的是学生信息:您选择的是学生信息:”n; break; case t: /当选择教师信息时当选择教师信息时 cout“* 您选择的是教师信息您选择的是教师信息:”n; break; case w: /当选择工人信息时当选择工人信息时 cout“* 您选择的是工人信息:您选择的是工人信息

52、:”n; break; default: /当选择其他时当选择其他时 cout* 感谢您的使用,再见!感谢您的使用,再见!n; pt = false; 运行结果:选择信息种类(S-学生;T-教师;W-工人;Q-退出):s* 您选择的是学生信息:选择信息种类(S-学生;T-教师;W-工人;Q-退出):t* 您选择的是教师信息:选择信息种类(S-学生;T-教师;W-工人;Q-退出):w* 您选择的是工人信息:选择信息种类(S-学生;T-教师;W-工人;Q-退出):q* 感谢您的使用,再见!2. continue语句语句 continuecontinue语句也常用于循环控制和开关分支控制内,语句也常

53、用于循环控制和开关分支控制内,但其作用与但其作用与breakbreak语句有所不同:语句有所不同:continuecontinue语句仅使语句仅使所在层的本次循环终止执行;而所在层的本次循环终止执行;而breakbreak语句则终止所语句则终止所在层的整个循环的执行。在在层的整个循环的执行。在forfor循环,循环,whilewhile循环和循环和dodo循环中,循环中,continuecontinue语句的出现导致程序的执行转回对语句的出现导致程序的执行转回对循环条件的判断。在各种循环体中,常需要根据不同循环条件的判断。在各种循环体中,常需要根据不同的需要选择合适的的需要选择合适的break

54、break或或continuecontinue语句,使程序的语句,使程序的流程与设计意图相符。流程与设计意图相符。 n=1;while(n100);continue;for(n=1;n100;n+);continue;2.4 函数函数 C+C+源程序有如下结构特点:源程序有如下结构特点:(1 1)一个)一个C+C+源程序可以由一个或多个源文件源程序可以由一个或多个源文件组成;组成;(2 2)每个源文件可由一个或多个)每个源文件可由一个或多个函数函数组成;组成;(3 3)一个源程序不论由多少个文件组成,都)一个源程序不论由多少个文件组成,都有且只能有一个有且只能有一个mainmain函数,即主函

55、数。函数,即主函数。(4 4)C+C+程序从程序从mainmain函数开始执行直到函数开始执行直到mainmain函函数结束,其他函数都由数结束,其他函数都由mainmain函数调用。函数调用。(5 5)要使用库函数或用户自定义文件,需用)要使用库函数或用户自定义文件,需用includeinclude命令。命令。2.4.1 函数定义和函数原型函数定义和函数原型1.函数定义函数定义 函数定义的一般格式如下函数定义的一般格式如下: () 说明说明:(1)函数函数 与与return语句中的语句中的类型不一致时类型不一致时,以以 为准。为准。(2)函数名的命名规则应符合函数名的命名规则应符合C+标识符

56、的命名规则:标识符的命名规则: (a)所有标识符必须由一个字母或下划线开头;所有标识符必须由一个字母或下划线开头; (b) 其他部分可用字母、下划线或数字组成;其他部分可用字母、下划线或数字组成; (c)大小写敏感。大小写敏感。2. 函数原型函数原型 若一个函数的调用出现在该函数定义若一个函数的调用出现在该函数定义之前之前, ,则在调用前必须先对函数进行原型则在调用前必须先对函数进行原型说明。函数原型向编译系统提供函数返说明。函数原型向编译系统提供函数返回值类型、函数名、参数的个数和类型。回值类型、函数名、参数的个数和类型。 函数原型的一般格式如下:函数原型的一般格式如下: ( (); 例:编

57、写函数实现求任意两个整数的例:编写函数实现求任意两个整数的 最大值。最大值。#include int max(int, int)void main() int a,b,c; cinab; c=max(a,b); cout“Max is:”cy) return x; else return y; 2.4.2 函数调用函数调用 在调用子函数时,主函数与被调用子在调用子函数时,主函数与被调用子函数之间的数据传递一般依靠子函数的函数之间的数据传递一般依靠子函数的参数进行。根据实参与形参之间数据传参数进行。根据实参与形参之间数据传递方式的不同,可以把函数调用分为:递方式的不同,可以把函数调用分为:l传值

58、调用传值调用l传地址调用传地址调用l引用调用引用调用1.传值调用传值调用 传值调用先计算出传值调用先计算出实参实参表达式的值,再将表达式的值,再将实参实参的值依次的值依次复制给复制给形参形参。在被调用函数的执行过程中,形参值的改变不。在被调用函数的执行过程中,形参值的改变不会影响实参的值,即数据的传递是单向的。形参是函数中的会影响实参的值,即数据的传递是单向的。形参是函数中的局部变量,具有独立的存储空间。局部变量,具有独立的存储空间。 例:例: intint f(intf(int x x, , intint y y) ) void main() void main() intint a a=1

59、, =1, b b=2, c;=2, c; c= c=f(f(a a, ,b b););#include void swap(int x,int y) int temp; temp=x; x=y; y=temp; void main() int a=1,b=2; cout“Before swap a=”a“,b=”bendl; swap(a,b); cout“After swap a=”a“,b=”bendl;运行结果运行结果: Before swap a=1,b=2 After swap a=1, b=22.2.传地址调用传地址调用 在传地址调用方式中,在传地址调用方式中,形参形参用指针变量

60、实现,实参用指针变量实现,实参用地址值。调用时,将实参地址赋给对应的形参指针用地址值。调用时,将实参地址赋给对应的形参指针变量,使形参指针指向实参。故在被调用函数中可通变量,使形参指针指向实参。故在被调用函数中可通过形参指针对实参进行间接读或写。过形参指针对实参进行间接读或写。例:例:voidf(int*x,int*y)voidmain()inta=1,b=2;f(&a,&b);例例2-9 传地址调用举例传地址调用举例#include void swap(int* x,int* y) int temp; temp=*x; *x=*y; *y=temp;void main() int a=1,b

61、=2; cout“Before swap”a“,b”bendl; swap(&a,&b); cout“After swap”a“,b”bendl;运行结果: Before swap a=1,b=2 After swap a=2,b=13.引用调用引用调用 在这种调用方式中,函数的形参用引用实在这种调用方式中,函数的形参用引用实现。调用函数时,实参用变量名,对形参值现。调用函数时,实参用变量名,对形参值的改变,实质上是对实参变量值的改变。因的改变,实质上是对实参变量值的改变。因此,引用调用的效果与传地址调用相同,但此,引用调用的效果与传地址调用相同,但比传地址调用方便、直接。比传地址调用方便、直

62、接。例例2-10 引用调用举例引用调用举例#include void swap(int& x,int& y) int temp; temp=x; x=y; y=temp;void main() int a=1,b=2; cout“Before swap”a“,b”bendl; swap(a,b); cout“After swap”a“,b”bendl;运行结果运行结果: Before swap a=1,b=2 After swap a=2,b=12.4.3 内联函数内联函数 内联函数是在程序中用内联函数是在程序中用inlineinline定义的函数,定义的函数,在编译程序时,编译系统将程序中出

63、现内联在编译程序时,编译系统将程序中出现内联函数调用的地方用函数体替换。虽然增加了函数调用的地方用函数体替换。虽然增加了空间开销,但节省了调用函数的时间开销,空间开销,但节省了调用函数的时间开销,是一种空间换时间的方案。是一种空间换时间的方案。 内联函数定义的一般格式如下:内联函数定义的一般格式如下: inline () 例例2-11 2-11 用内联函数实现求两个整数中最大值。用内联函数实现求两个整数中最大值。inline int max(int x,int y) return xy?x:y;void main() int a,b,c; coutab; cout“The max is:”ma

64、x(a,b)endl; 2.4.4 函数重载函数重载 函数重载是指具有相似功能的不同函数使用同一函函数重载是指具有相似功能的不同函数使用同一函数名,但这些同名函数的参数类型、参数个数、返回数名,但这些同名函数的参数类型、参数个数、返回值类型、函数的功能可以不同。编译系统将根据函数值类型、函数的功能可以不同。编译系统将根据函数参数类型和个数来判断调用哪个函数。这体现了参数类型和个数来判断调用哪个函数。这体现了C+C+对多态性的支持。对多态性的支持。例例2-12 2-12 函数重载举例函数重载举例#include int abs(int x) return x0?x:-x; double abs(

65、double x) return x0?x:-x; long abs(long x) return x0?x:-x; voidmain()intx1=4;doublex2=5.5;longx3=6L;cout“|x1|=”abs(x1)endl;cout“|x2|=”abs(x2)endl;cout“|x3|=”abs(x3)endl;运行结果: |x1|=4 |x2|=5.5 |x3|=62.4.6 作用域作用域 1.1.作用域作用域 在一个函数体中定义的变量在一个函数体中定义的变量, ,在这个函数在这个函数体执行完之后分配给它的内存单元就被释放体执行完之后分配给它的内存单元就被释放了了,

66、,因此离开该函数就不能再使用了该变量了因此离开该函数就不能再使用了该变量了, ,成为无效的变量了。即这个变量仅在这个函成为无效的变量了。即这个变量仅在这个函数体内有效,其有效性的范围就是这个函数数体内有效,其有效性的范围就是这个函数体。一般地,体。一般地,变量有效性的范围称为变量的变量有效性的范围称为变量的作用域作用域。C+C+语言中的所有量都有自己的作用语言中的所有量都有自己的作用域。作用域分为:域。作用域分为:局部作用域局部作用域(块作用域)、(块作用域)、函数原型作用域函数原型作用域、文件作用域文件作用域和和类作用域类作用域。(1 1)局部作用域)局部作用域 一个变量在一个函数体内或复合

67、语句块内定义时一个变量在一个函数体内或复合语句块内定义时,它具有块作用域,其作用域是从定义点开始,直到,它具有块作用域,其作用域是从定义点开始,直到该块结束为止。该块结束为止。 例如例如: void main() int i; for (i=1;i4;i+) int j=5; /j的作用域开始的作用域开始 j+; coutj“”; /j的作用域结束的作用域结束 coutj; (2 2)函数作用域)函数作用域 在每个函数中使用的语句标号是唯一具有在每个函数中使用的语句标号是唯一具有函数作用域的标识符。函数作用域的标识符。它在本函数中有效,供它在本函数中有效,供本函数的本函数的gotogoto 语

68、句跳转使用。由于语句标号语句跳转使用。由于语句标号不是变量,故函数作用域不属于变量的一种作不是变量,故函数作用域不属于变量的一种作用域。用域。 intint sum(intsum(int n) n) intint i=1,s=0; i=1,s=0; Loop:Loop: s= s=s+is+i; ; if (i=n) if (i=n) gotogoto LoopLoop; ; return s; return s; (3 3)函数原型作用域)函数原型作用域 函数原型声明中的参数的作用域开始于函数原型声函数原型声明中的参数的作用域开始于函数原型声明的左括号,结束于函数原型声明的右括号。要在原明的

69、左括号,结束于函数原型声明的右括号。要在原型声明之外使用参数必须另外定义,否则出现无定义型声明之外使用参数必须另外定义,否则出现无定义的标识符。的标识符。例如:例如: double double Average(doubleAverage(double x,doublex,double y,doubley,double z); z); / / 原型声明原型声明 x=90; x=90; / error x/ error x无定义无定义 void main()void main() ; ; double double Average(doubleAverage(double x,doublex,d

70、ouble y,doubley,double z) z) / / 函数定义函数定义 return return x+y+zx+y+z; ; (4 4)文件作用域)文件作用域 在一个程序文件中,如果一个变量定义在所在一个程序文件中,如果一个变量定义在所有函数之外,并且定义时带有关键字有函数之外,并且定义时带有关键字static,static,则该变量在整个文件中有效。它具有文件作用则该变量在整个文件中有效。它具有文件作用域,但在其他文件中无效。例如:域,但在其他文件中无效。例如: /program1/program1 static static intint valuevalue; ; inti

71、nt sum()sum() valuevalue=0;=0; void main() void main() value=2*sum()value=2*sum(); ; 2.2.局部变量和全局变量局部变量和全局变量 从变量的作用域来分从变量的作用域来分, ,可以将变量分为可以将变量分为全局变量全局变量和和局部变量局部变量。(1 1)全局变量)全局变量在一个程序中,当一个变量定义在在一个程序中,当一个变量定义在所有文件的函数之前,它可用于任何一个函数,所有文件的函数之前,它可用于任何一个函数,则该变量称为全局变量则该变量称为全局变量。全局变量具有全局作用全局变量具有全局作用域,该变量在一个程序包

72、括的所有文件中都有效,域,该变量在一个程序包括的所有文件中都有效,它可以被程序中的所有函数使用。例如:它可以被程序中的所有函数使用。例如: /P0.h/P0.h intint g; g; /P1.cpp/P1.cpp #include “P0.h” #include “P0.h” /P2.cpp/P2.cpp #include “P0.h” #include “P0.h” (2 2)局部变量)局部变量在一个语句块或函数内定义的在一个语句块或函数内定义的变量其作用域仅限于该语句块或函数,离开变量其作用域仅限于该语句块或函数,离开该语句块或函数之后它就无效。这种变量称该语句块或函数之后它就无效。这

73、种变量称为局部变量。为局部变量。 局部变量的类型修饰符是局部变量的类型修饰符是autoauto, ,习惯上都习惯上都省略。若在局部变量定义前面加上关键字省略。若在局部变量定义前面加上关键字staticstatic, ,则称为则称为静态变量静态变量,若静态变量没有被,若静态变量没有被初始化,则编译时会被自动初始化为初始化,则编译时会被自动初始化为0 0。静态。静态变量在整个程序的运行期间都是存在的,但变量在整个程序的运行期间都是存在的,但其作用域是局部的。其作用域是局部的。例例2-13 变量的作用域和生存期变量的作用域和生存期#include void f1(); int a=1,b=2; st

74、atic int c; a+; b+; c+; cout ab c endl;void main()int a=1,b=2,c=3; f1(); f1(); f1(); coutabcx;x; ncoutcout:ostreamostream类对象,用于处理标准输出,它将输类对象,用于处理标准输出,它将输出流中的数据发送到标准输出设备(通常是显示器)出流中的数据发送到标准输出设备(通常是显示器)上,并在标准输出设备上进行显示。上,并在标准输出设备上进行显示。 例如:例如: coutcout“输出变量的值:输出变量的值:”x;x;作业习题:习题:书面习题:教材中第126128面的习题3、4、9、10、13;第162163面的习题3、5、6上机习题:教材中第128面的习题10、第163面的习题5

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号