




已阅读5页,还剩188页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象编程C程序设计,2,主要参考书,面向对象建模与设计,Rumbaugh,电力出版社面向对象分析与设计,GradyBooch,机械工业出版社ThinkinginC+,BruceEckelC+Primer,StanleyBLippman,中国电力出版社C+语言及其程序设计教程,张国峰,电子工业出版社C+程序设计教程,钱能,清华大学出版社深入浅出MFC,2Ed,侯俊杰(侯杰),松岗。VisualC+技术内幕,Microsoft,北京希望电子出版社,3,主要网络资源,面向对象基本概念,什么是软件开发?,软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界映射到计算机世界的过程现在的计算机的数学理论基础是图灵于1937年提出的图灵机模型,1945年,电子计算机诞生。现代电子计算机的体系结构及实际计算模型来自冯.诺依曼的思想。1946年他和他的同事们提出了程序放入内存,顺序执行的思想,这样,当算一道新题时就只需采取改变计算机中的程序的“软”的方法英国的科学家维尔克斯实现了冯.诺依曼的思想,领导研制了“艾克萨克”。,计算机开发语言,机器语言、汇编语言、高级语言,高级语言可能有几千种计算机语言都是某种程度的形式语言软件开发的过程就是程序员对客观世界问题域形式化的过程,现实世界的问题域,建立模型,编程实现,计算机世界执行求解,计算机高级语言的历史1945年德国人楚译为其Z4设计的PlanCalcu1。1952年美国尤尼法克公司的ShortCode(在计算机上实现的第一个)由美国科学家巴科斯设计,1956年在IBM计算机上实现的FORTRAN。70年代以来的PASCAL80年代,C语言80年代后期,C+90年代以来,语言不仅要OO,而且要Visual,更要Web,Java快速推广。计算机语言的变化和发展,反映了人们在计算机领域认识论的发展。,PO方法:现实世界流程图(变量,函数)PO语言执行求解OO方法:现实世界类图(对象,方法)OO语言执行求解OO作为一种思想及编程语言,为软件开发的整个过程:分析、设计到coding,提供了一个完整解决方案。C+,smalltalk,simula等语言,UseCase方法,ROSE工具,Jacboson和Rational公司,从PO到OO,9,面向过程思想,问题域(Domain),以问题域的系统流程为中心分析,Sub1,Sub2,Subn,.,各子流程实现-函数化,Func1,Func2,Funcn,.,根据系统的流程组建软件,通过函数的调用实现,10,面向对象思想,问题域(Domain),以问题域中的事物为中心思考问题,Object1,Object2,Objectn,.,对象归类-抽象化,Class1,Class2,Classn,.,类实例化:定义对象,构建系统,形成解决方案,11,面向对象的特点,封装(Encapsulation)通过定义类实现继承(Inheritance)通过派生新类实现多态性(Morphism)虚拟函数实现,从软件工程的发展历史来看:为解决“软件危机”,人们尝试从2个方向努力:从管理的角度,希望实现软件开发过程的工程化,提出了各种各样的软件生命周期模型,最著名的是瀑布模型:分析设计编码测试维护对软件开发过程中分析、设计的方法的研究70年代的结构化开发方法,即PO计算机世界中的抽象层次XO(X?-Oriented)最高的抽象层次SO(Service-Oriented),OO(对象、类)PO(过程、函数、变量)变量、运算、表达式、语句字节(4位、8位、16位、32位、64位)二进制串0101011110001最低的抽象层次,OO之后是什么?,13,第一部分C+语言及程序设计,本部分主要内容包括:C+基本语法类的定义类的继承对象的定义及应用异常处理流类库,14,第一章概述,C语言1972年由DennisRichie在AT初始化数据类型标识符1(初始值1),标识符2(初始值2),。标识符n(初始值n);数据类型标识符1=初始值1,标识符2=初始值2,。标识符n=初始值n;赋值I=10;,22,2.4枚举类型,定义:通过枚举一个类型的值域来定义一个数据类型,值域是通过在枚举声明时所指定的一组文字量(又称枚举常量)指定的。语法形式:enum标识符标识符1,标识符2,标识符3,。标识符n;,23,举例:,enumcolorRED,BLUE,GREEN,YELLOW;enumcolorBLACK,GREEN,BLUE,RED=4,YELLOW;/YELLOW=5enumstatusFALSE,TRUE,FAIL=0;注意:枚举文字量的值缺省从0开始,依次类推。可以为枚举文字量指定特定的值。枚举文字量的值可以重复。,24,2.5表达式,文字或标识对象的标识符是最简单的表达式,其值就是文字或对象的值。一个表达式的值可以用来参与其他操作,即用作其他操作符的操作数。括号中的表达式仍然是表达式。其值不变。,25,表达式由操作数和操作符组成,操作符分:算术操作符:+、-、*、/、%关系操作符:、=、=、intint-unsigned-long-unsignedlong-doublefloat-double,27,赋值类型强制右边的表达式类型映射成左值的类型。强制类型转换static_cast(E)T(E)(T)E,28,类型强制举例j=k+d;static_cast(f)int(f)(int)f,29,2.8常量表达式,为计算表达式值所需信息在编译时都能获得。例:34/5.8*4.540*sizeof(int)PI*4.0*4.0,30,第三章控制结构,顺序结构表达式语句空语句块语句选择结构循环结构,31,3.1顺序结构,表达式语句:由一个表达式构成的简单语句。空语句:由一个分号构成的简单语句。块语句:由一组具有逻辑关系的语句构成的组合语句。,32,3.2选择结构,ifif-else,33,Ifexpr1statement1elseifexpr2statement2elseifexpr3statement3elsestatement4,Ifelse嵌套要注意其对应关系(同一块中最接近的),34,Ifexpr1statement1elseifexpr2statement2elseifexpr3statement3elsestatement4,35,switch语句(开关分支语句)一般形式:,switch(expression)caseconstexpr1:statementgroup1;break;caseconstexpr2:statementgroup2;break;.caseconstexprn:statementgroupn;break;default:statementgroup;break;,36,执行过程:,37,说明:switch后表达式和常量表达式可以为任何类型每个case的常量表达式值必须互不相同case出现顺序不影响执行结果“case常量表达式”只起语句标号作用,找到匹配入口后,会依次执行下去。所以必须用break语句跳出switch结构default可省略,一般将default放于最后,此时default后可以不加breakcase后可包含多个可执行语句,且不必加多个case可共用一组执行语句,如:caseA:caseB:caseC:printf(“score60n”);break;.,38,3.3循环结构,39,while语句一般形式:,while(expression)循环体语句;,执行流程:,40,while语句一般形式:,while(expression)循环体语句;,执行流程:,41,dowhile语句一般形式:,do循环体语句;while(expression);,执行流程:,42,特点:先执行循环体,后判断表达式说明:dowhile循环至少要执行一次循环体dowhile可转化成while结构一般若dowhile与while的循环体相同,结果也一样;但当while后的表达式一开始就为0,则两者结果不同dowhile是“直到型”循环,但与until型循环不同dowhile循环中,while(expression)后面有分号(;),43,for语句一般形式:,for(expr1;expr2;expr3)循环体语句;,执行流程:,44,for语句一般形式:,for(expr1;expr2;expr3)循环体语句;,执行流程:,45,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增值)循环体语句;,说明:for语句中expr1,expr2,expr3都可以省略,但分号(;)不可省expr1,expr3可以是与循环变量无关的任何式子,也可以是逗号表达式expr2一般是关系表达式或逻辑表达式,但也可以是数值或字符表达式;只要非0,就执行循环体for语句可以转换成while结构,expr1;while(expr2)循环体语句;expr3;,46,几种循环的比较一般情况下,四种循环结构可相互代替;但一般不提倡goto型循环while和dowhile结构的循环体中包含使循环趋于结束的语句;for循环一般在expr3中包含使循环趋于结束的语句,但也可以放在循环体中,或将循环体放在expr3中while和dowhile结构的循环变量初始化应在while和dowhile语句之前完成;for循环一般放在expr1中while和for先判断表达式,后执行语句,循环体被执行0次或n次;dowhile循环先执行语句,后判断表达式,循环体至少执行1次while,dowhile和for循环可用break跳出循环,continue结束本次循环;而goto型循环不能用break和continue控制,47,嵌套循环,循环是可以嵌套的,48,3.4辅助控制语句,goto语句break语句功能:可用在for,while,dowhile循环语句和switch选择语句中来终止它们的执行(即跳出循环体结束循环,或跳出switch结构,执行switch语句下面的一个语句说明:在多层嵌套的循环或选择语句中,break终止并跳出最近那一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中continue语句,49,50,51,continue语句功能:仅用于循环语句中。结束本次循环,跳出循环体中尚未执行的语句,接着进行下一次是否执行循环体的判断,52,4.1函数的基本概念,完成特定功能的一段代码具有合法的名称具有一定返回类型可以多次调用基本形式:,返回类型函数名(形式参数1,形式参数2,。,形式参数n)函数体;函数的返回类型可以是:各种数据类型、指针类型或void,第四章函数,53,4.2参数的传递,值调用,54,4.2参数的传递,引用调用,55,4.3内联函数,函数调用需要建立环境、进行参数传递等工作,对于一些简单的函数,可以采用内联函数的方式使用inline关键字定义的函数是内联函数。注意:内联函数中不能包含switch语句和循环结构,也不能声明异常接口。,56,4.4重载,具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。,57,4.5带缺省参数值的函数,函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。例:voidfun(intx,inty=0)voidfun(intx),58,4.6异常处理基础,函数执行过程中出现的不正常情况-异常。函数遇到异常时希望调用者捕获异常并进行处理。,59,5.1类的结构,一个对象从使用者的角度看,它具有某些状态并提供了一些方法来操作这些状态。C+的类作为对象的抽象完全体现了这一点。状态-表现为一些数据。方法-表现为一些函数。,第五章类,60,5.1类的结构,C+类的说明,61,5.1类的结构,举例:,62,5.1类的结构,说明:public后声明的是公有数据成员和成员函数,可被任何程序单元引用。private后声明的是私有数据成员和成员函数,仅可被类内部引用。Public和private出现的顺序和次数是任意的。,63,5.1类的结构,类成员函数的实现,64,举例,65,5.2类的实例化-对象的实现,66,类的实例化-举例,67,5.3构造函数和析构函数,构造函数的作用是在对象被创建时使用特定的值构造对象。析构函数的作用是在对象被删除时做一些清理工作。构造函数的特点:与类同名可以重载没有返回值析构函数是类名前加,68,5.3构造函数和析构函数举例,69,5.3构造函数和析构函数举例,70,5.3构造函数和析构函数举例,71,5.4成员函数的内联实现,函数体放在类体内。函数体放在类体外,使用inline关键字。,72,5.4成员函数的内联实现,73,5.5带缺省参数值的成员函数和成员函数的重载,74,5.5带缺省参数值的成员函数和成员函数的重载,75,5.5带缺省参数值的成员函数和成员函数的重载,76,第六章程序结构,对象的三个属性:作用域、可见性、生存期静态成员函数与静态数据成员友员,77,作用域及可见性,一个标识符的有效区域。分为:函数原型作用域、块作用域、类作用域、文件作用域。,78,函数原型作用域,函数原型中所作的参数声明在该作用域,始于左括号,结束于右括号。,79,块作用域,块作用域由一对花括号定义。(局部作用域),80,块作用域,81,类作用域,类内部定义的成员具有类作用域,82,文件作用域,全局作用域,83,可见性,标识符是否可以引用。在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。C+中,标识符必须先声明后引用,在同一作用域中不能生命同样的标识符。,84,可见性举例,85,对象的生存期,静态生存期与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变文件作用域或用static指定。若未显式指定初始值,为零。动态生存期在函数内部(块作用域)声明的对象是动态生存期。若未显式指定初始值,为任意值。,86,对象的生存期举例,87,数据共享,数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。数据存储在全局对象中,通过全局对象进行数据交换。封装在类中。,88,举例,89,举例,90,静态成员函数和静态数据成员,全局对象存在的问题可见性无限制不能保证操作的合法性解决上述问题的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。,91,举例,92,举例,93,举例,94,举例,95,举例,96,友员,通过声明a模块是b模块的友员,a模块可以引用b模块中的隐藏的信息(私有数据成员和私有成员函数)。这种技术破坏了类的封装机制。声明的语法如下:friend函数名(参数列表);可以声明友员类,97,举例,98,99,第七章编译指令,#include#define#undef#if#else#elif#endif#error,100,#include的两种形式,#includeC+系统目录下的include目录#include“my.h”当前子目录、C+系统子目录,101,#define的两种形式,#define标识符替换串#define标识符(参数列表)替换串,102,举例:,103,举例:,104,举例:,105,第八章对象指针和对象数组,要构成程序,必须有众多对象C+提供了把众多对象组成更复杂对象的机制:指针和数组,106,指针,指针:对象的地址指针对象:存放指针的对象声明指针对象的语法:T*标识符;int*pointer;一个指针对象被赋值为一个对象的地址后,称指针指向对象。,107,为指针对象引入的两种操作,数组元素也可以用指针引用,113,数组和指针,通过指针引用数组元素定义指针对象数组的地址赋值给指针对象。指针引用数组元素的方法*(pointer+n)pointern,114,115,116,117,对象数组,没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。,118,举例,119,引用,是标识对象的一种机制(是对象的一个别名)一般用作参数类型、函数返回类型。一般语法如下:基本类型删除语法如下:deleteptr;数组对象的创建int*ptr=newint10;数组对象的删除deleteptr;,124,125,126,127,指针数组,数组元素的类型是指针,这样的数组称指针数组。语法:T*标识符元素个数;,128,多维数组与指针,多维数组可以解释为其元素是多维数组的一维数组。,129,this指针,一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。,130,具有子对象的类类型,用内部包含子对象的类实现复杂的类子对象的初始化,131,132,133,134,135,第九章对类的进一步讨论,拷贝构造函数赋值const关键字类型强制,136,拷贝构造函数,使用一个对象初始化一个正在建立的同类对象。拷贝初始化构造函数的参数是引用参数。每个类都一定有一个拷贝初始化构造函数如未定义,则编译器自动生成一个。功能:用作为初始值的对象的每个数据成员初始化正建立对象的对应的数据成员。,137,138,以值调用方式传递参数时函数返回对象时,139,赋值,当需要进行对象之间的赋值操作时,必须定义赋值操作。为与习惯一致,一般用作为=赋值操作符当使用操作符作为函数名时,必须与关键字operator合用。赋值操作的参数最好用引用方式。,140,141,赋值操作的参数最好采用引用方式。赋值操作的最好返回对被赋值对象的引用。一般形式:X,142,编译器产生的拷贝初始化和赋值操作的缺陷,当类中声明有指针数据成员时,将产生问题。,143,const关键字,是一个类型修饰符,const描述的类型定义的对象是常对象。Intconsta=1;int*constp;p-*const-intconstint*a;a-*-constint确定不修改对象的数据成员的成员函数可以定义为const函数。Const成员函数不能更新非静态数据成员,也不能调用没有使用const修饰的成员函数.,144,第十章操作符重载,当使用操作符来表达对对象的某个操作时,可以将操作符函数声明为类的成员函数或类的友员函数。操作符的参数个数、优先级、结合性和使用语法是由C+规定的,不能被改变。重载操作符的形参不能具有缺省值。重载操作符的返回值类型任意,但最好不是void。,145,一元操作符重载为友员函数时,只能具有一个形参;重载为成员函数时,不能声明形参,所需的一个形参由成员函数的自引用参数提供。二元操作符重载为友员函数时,只能具有两个形参;重载为成员函数时,只能声明一个形参,这个形参表示右操作数,左操作数由成员函数的自引用参数提供。,146,重载为类的成员函数,147,重载为类的成员函数,148,重载为类的成员函数,149,重载为类的成员函数,150,重载为类的友元函数,151,重载为类的友元函数,152,重载为类的友元函数,153,重载为类的友元函数,154,两种方法的比较,一元函数最好重载为成员函数二元函数一般重载为友元函数27.5+x赋值操作符只能重载为成员函数27.5=x+和-操作符有两种形式,一般被重载为成员函数其中后缀操作重载后带有一个整型参数。,155,两种方法的比较,下标操作符只能被重载为成员函数函数调用操作符,156,第十一章继承,通过已有的类进行扩展产生新类的过程产生的新类称派生类产生派生类的类称基类或父类。从一个基类派生称单基继承,从多个基类派生称多基继承。,157,派生语法,158,Mouse,Screen,Device,Keyboard,Tree,AppleTree,Fruit,159,访问控制,访问控制用语控制基类中声明的名字在多大的范围内能够被派生类的用户访问访问控制有三种public,protected,private,基类模块,派生类模块,间接派生类模块,其他程序模块,160,161,公有继承,162,公有继承,163,私有继承,164,私有继承,165,在派生类中访问基类成员,166,保护的成员,对V模块是public对H模块是private,167,保护的成员,168,多继承,可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。,169,构造函数和析构函数,派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。一般形式如下:C:C(参数表0):C1(参数表1),C2(参数表2),Cn(参数表n),170,构造函数和析构函数,如果冒号右边的某个基类的构造函数参数表为空,则可以省略该项。构造对象时,先执行基类的构造函数,然后执行派生类的构造函数。析构时则相反。多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中的顺序无关。,171,构造函数和析构函数,172,构造函数和析构函数,173,构造函数和析构函数,174,构造函数和析构函数,175,构造函数和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广水拖拉管施工方案
- 电商生态构建中的知识产权保护策略研究报告
- 图形的旋转课件简介
- 工程主体验收组织方案范本(3篇)
- 特殊建筑工程消防改造方案(3篇)
- 工程项目降碳活动方案(3篇)
- 深圳冷库工程设计方案(3篇)
- 园林风景工程施工方案(3篇)
- 建设工程方案设计招投标(3篇)
- 2025生产企业防疫试题及答案
- 全球低空经济2025年技术规范与实施白皮书
- 贵阳市2026届高三年级摸底考试英语试卷(含答案)
- 2025年城市燃气储气罐采购安装与运营维护服务合同范本
- 病房消毒及卫生管理课件
- 2025年国家公务员考录《行测》真题及参考答案
- 2025年城市管理笔试高频考点
- 艾滋病科普宣传课件
- 水泵房巡检流程培训课件
- 吊装专项施工方案
- 基本药物制度补助资金管理办法
- 无人机培训招生宣讲
评论
0/150
提交评论