《大工面向对象编程基础C总结.pptx》由会员分享,可在线阅读,更多相关《大工面向对象编程基础C总结.pptx(193页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象编程C程序设计2主要参考书面向对象建模与设计,Rumbaugh,电力出版社面向对象分析与设计,Grady Booch,机械工业出版社Thinking in C+,Bruce EckelC+Primer,Stanley B Lippman,中国电力出版社C+语言及其程序设计教程,张国峰,电子工业出版社C+程序设计教程,钱能,清华大学出版社深入浅出MFC,2Ed,侯俊杰(侯杰),松岗。Visual C+技术内幕,Microsoft,北京希望电子出版社3主要网络资源面向对象基本概念什么是软件开发?v软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界映射到计算机世界的过程 现在的计算
2、机的数学理论基础是图灵于1937年提出的图灵机模型,1945年,电子计算机诞生。现代电子计算机的体系结构及实际计算模型来自冯.诺依曼的思想。1946年他和他的同事们提出了程序放入内存,顺序执行的思想,这样,当算一道新题时就只需采取改变计算机中的程序的“软”的方法英国的科学家维尔克斯实现了冯.诺依曼的思想,领导研制了“艾克萨克”。计算机开发语言v机器语言、汇编语言、高级语言,高级语言可能有几千种v计算机语言都是某种程度的形式语言v软件开发的过程就是程序员对客观世界问题域形式化的过程现实世界的问题域建立模型编程实现计算机世界执行求解v计算机高级语言的历史1945年德国人楚译为其Z4设计的Plan
3、Calcu1。1952年美国尤尼法克公司的Short Code(在计算机上实现的第一个)由美国科学家巴科斯设计,1956年在IBM计算机上实现的FORTRAN。70年代以来的PASCAL80年代,C语言80年代后期,C+90年代以来,语言不仅要OO,而且要Visual,更要Web,Java快速推广。v计算机语言的变化和发展,反映了人们在计算机领域认识论的发展。vPO方法:现实世界 流程图(变量,函数)PO语言 执行求解 vOO方法:现实世界 类图(对象,方法)OO语言 执行求解OO作为一种思想及编程语言,为软件开发的整个过程:分析、设计到coding,提供了一个完整解决方案。C+,smallt
4、alk,simula等语言,Use Case方法,ROSE工具,Jacboson 和Rational公司从PO到OO9面向过程思想问题域(Domain)以问题域的系统流程为中心分析Sub1Sub2Subn.各子流程实现-函数化Func1Func2Funcn.根据系统的流程组建软件,通过函数的调用实现10面向对象思想问题域(Domain)以问题域中的事物为中心思考问题Object1Object2Objectn.对象归类-抽象化Class1Class2Classn.类实例化:定义对象,构建系统,形成解决方案11面向对象的特点封装(Encapsulation)通过定义类实现继承(Inheritanc
5、e)通过派生新类实现多态性(Morphism)虚拟函数实现v从软件工程的发展历史来看:为解决“软件危机”,人们尝试从2个方向努力:从管理的角度,希望实现软件开发过程的工程化,提出了各种各样的软件生命周期模型,最著名的是瀑布模型:分析 设计 编码 测试 维护 对软件开发过程中分析、设计的方法的研究70年代的结构化开发方法,即PO计算机世界中的抽象层次 XO(X?-Oriented)最高的抽象层次SO(Service-Oriented),OO(对象、类)PO(过程、函数、变量)变量、运算、表达式、语句字节(4位、8位、16位、32位、64位)二进制串 最低的抽象层次OO之后是什么?13第一部分 C
6、+语言及程序设计本部分主要内容包括:C+基本语法类的定义类的继承对象的定义及应用异常处理流类库14第一章 概述C语言语言19721972年由年由Dennis Richie在在AT&T设计设计为解决为解决C语言存在的问题研制语言存在的问题研制-“-“带类的带类的C”,1983命名为命名为C+对对C的类型系统改进和扩充的类型系统改进和扩充(更安全更安全)支持面向对象支持面向对象C+保持与保持与C兼容兼容(快速普及快速普及)C+不是纯粹的面向对象的语言不是纯粹的面向对象的语言1.1 C+的起源和特点151.2 程序的编译过程161.3 C+的词法记号关键字关键字各种常量各种常量操作符操作符标识符标识
7、符(由字母、数字、下划线组成,字(由字母、数字、下划线组成,字母和下划线开头)母和下划线开头)分隔符分隔符171.4 C+程序的结构18注释注释(有有/和和/*/*/两种)两种)输入和输出输入和输出函数函数(一个(一个C C程序至少包含一个函数,即程序至少包含一个函数,即mainmain函数)函数)变量(对象)变量(对象)符号常量符号常量表达式表达式语句语句19第二章 基本数据类型和表达式2.1C+的基本数据类型202.2文字量(常量)整数常量整数常量:无符号、有符号:无符号、有符号浮点常量浮点常量:浮点数据:浮点数据字符常量字符常量:一个字符,单引号:一个字符,单引号字符串常量字符串常量:赋
8、值、内存空间占用情况:赋值、内存空间占用情况布尔常量布尔常量:truetrue、falsefalse;TRUETRUE、FALSEFALSE,零、非零。零、非零。212.3对象声明基本语法如下:数据类型 标识符1,标识符2,。标识符n;初始化数据类型 标识符1(初始值1),标识符2(初始值2),。标识符n(初始值n);数据类型 标识符1=初始值1,标识符2=初始值2,。标识符n=初始值n;赋值I=10;222.4枚举类型定义:定义:通过枚举一个类型的值域来定义一个数据类型,通过枚举一个类型的值域来定义一个数据类型,值域是通过在枚举声明时所指定的一组文字量值域是通过在枚举声明时所指定的一组文字量
9、(又称枚举常量)指定的。(又称枚举常量)指定的。语法形式:语法形式:enum enum 标识符标识符 标识符标识符1 1,标识符,标识符2 2,标识符,标识符3 3,。,。标识符。标识符n;n;23举例:enum color RED,BLUE,GREEN,YELLOW;enum color RED,BLUE,GREEN,YELLOW;enum color enum color BLACK,GREEN,BLUE,RED=4,YELLOW;BLACK,GREEN,BLUE,RED=4,YELLOW;/YELLOW=5/YELLOW=5enum status FALSE,TRUE,FAIL=0;en
10、um status FALSE,TRUE,FAIL=0;注意:枚举文字量的值缺省从0开始,依次类推。可以为枚举文字量指定特定的值。枚举文字量的值可以重复。242.5表达式文字或标识对象的标识符是最简单的表达文字或标识对象的标识符是最简单的表达式,其值就是文字或对象的值。式,其值就是文字或对象的值。一个表达式的值可以用来参与其他操作,一个表达式的值可以用来参与其他操作,即用作其他操作符的操作数。即用作其他操作符的操作数。括号中的表达式仍然是表达式。其值不变。括号中的表达式仍然是表达式。其值不变。25表达式由操作数和操作符组成,操作符分:表达式由操作数和操作符组成,操作符分:算术操作符算术操作符:
11、+、-、*、/、%关系操作符关系操作符:、=、=、=intchar,short-intint-unsigned-long-unsigned int-unsigned-long-unsigned long-doublelong-doublefloat-doublefloat-double27赋值类型强制赋值类型强制右边的表达式类型映射成左值的类型。右边的表达式类型映射成左值的类型。强制类型转换强制类型转换static_cast(E)static_cast(E)T(E)T(E)(T)E(T)E28类型强制举例类型强制举例j=k+d;j=k+d;static_cast(f)static_cast(f
12、)int(f)int(f)(int)f(int)f292.8常量表达式为计算表达式值所需信息在编译时都能获为计算表达式值所需信息在编译时都能获得。得。例:例:34/5.8*4.534/5.8*4.540*40*sizeof(int)sizeof(int)PI*4.0*4.0PI*4.0*4.030第三章 控制结构顺序结构顺序结构表达式语句表达式语句空语句空语句块语句块语句选择结构选择结构循环结构循环结构313.1顺序结构表达式语句表达式语句:由一个表达式构成的简单语:由一个表达式构成的简单语句。句。空语句空语句:由一个分号构成的简单语句。:由一个分号构成的简单语句。块语句块语句:由一组具有逻辑
13、关系的语句构成:由一组具有逻辑关系的语句构成的组合语句。的组合语句。323.2 选择结构ififif-elseif-elseexprstatement非0=0exprstatement1statement2非0=033expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0If expr1 statement1else if expr2statement2else if expr3statement3elsestatement4If else 嵌套要注意其对应关系(同一块中最接近的)34expr1statemnt1非0=0e
14、xpr2expr3statemntnstatemnt3statemnt2非0非0=0=0If expr1 statement1else if expr2statement2else if expr3statement3elsestatement435switch语句(开关分支语句)一般形式:switch(expression)case const expr1:statement group 1;break;case const expr2:statement group 2;break;.case const expr n:statement group n;break;default:sta
15、tement group;break;36执行过程:switchexpr语句组1语句组2语句组n语句组.const 1const 2const ndefaultcase 37说明:lswitch后表达式和常量表达式可以为任何类型l每个case的常量表达式值必须互不相同lcase出现顺序不影响执行结果l“case 常量表达式”只起语句标号作用,找到匹配入口后,会依次执行下去。所以必须用break语句跳出switch 结构ldefault可省略,一般将default放于最后,此时default后可以不加breaklcase后可包含多个可执行语句,且不必加 l多个case可共用一组执行语句如:cas
16、e A:case B:case C:printf(“score60n”);break;.383.3循环结构39while语句一般形式:while(expression)循环体语句;执行流程:expr循环体假(0)真(非0)while40while语句一般形式:while(expression)循环体语句;执行流程:expr循环体假(0)真(非0)while41dowhile语句一般形式:do 循环体语句;while(expression);执行流程:do循环体expr真(0)假(非0)while42特点:先执行循环体,后判断表达式说明:ldowhile循环至少要执行一次循环体ldowhile可
17、转化成while结构l一般若dowhile与while的循环体相同,结果也一样;但当while后的表达式一开始就为0,则两者结果不同ldowhile是“直到型”循环,但与until型循环不同ldowhile循环中,while(expression)后面有分号(;)expr循环体假(0)真(非0)循环体While循环43for语句一般形式:for(expr1;expr2;expr3)循环体语句;执行流程:expr2循环体假(0)真(非0)forexpr1expr344for语句一般形式:for(expr1;expr2;expr3)循环体语句;执行流程:expr2循环体假(0)真(非0)forex
18、pr1expr345for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值)循环体语句;说明:lfor语句中expr1,expr2,expr3 都可以省略,但分号(;)不可省lexpr1,expr3可以是与循环变量无关的任何式子,也可以是逗号表达式lexpr2一般是关系表达式或逻辑表达式,但也可以是数值或字符表达式;只要非0,就执行循环体lfor语句可以转换成while结构expr1;while(expr2)循环体语句;expr3;46几种循环的比较一般情况下,四种循环结构可相互代替;但一般不提倡goto型循环while和dowhile结构的循环体中包含使循环趋于结束的语句;f
19、or循环一般在expr3中包含使循环趋于结束的语句,但也可以放在循环体中,或将循环体放在expr3中while和dowhile结构的循环变量初始化应在while和dowhile语句之前完成;for循环一般放在expr1中while和for先判断表达式,后执行语句,循环体被执行0次或n次;dowhile循环先执行语句,后判断表达式,循环体至少执行1次while,dowhile和for循环可用break跳出循环,continue结束本次循环;而goto型循环不能用break和continue 控制47嵌套循环循环是可以嵌套的483.4辅助控制语句gotogoto语句break语句功能:可用在for
20、,while,dowhile循环语句和switch选择语句中来终止它们的执行(即跳出循环体结束循环,或跳出switch结构,执行switch语句下面的一个语句说明:在多层嵌套的循环或选择语句中,break终止并跳出最近那一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中continue语句49exprbreak;假(0)真(非0)whiledobreak;.expr真(0)假(非0)while50expr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.con
21、st 1const 2const ndefaultcase 51continue语句功能:仅用于循环语句中。结束本次循环,跳出循环体中尚未执行的语句,接着进行下一次是否执行循环体的判断exprcontinue;假(0)真(非0)while假(非0)docontinue;.expr真(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3524.1 函数的基本概念完成特定功能的一段代码完成特定功能的一段代码具有合法的名称具有合法的名称具有一定返回类型具有一定返回类型可以多次调用可以多次调用基本形式:基本形式:返回类型返回类型 函数名(形式参数函数名(形式参数1
22、1,形式参数形式参数2 2,。,形式参数,。,形式参数n)n)函数体;函数体;函数的返回类型可以是:各种数据类型、指针类型或函数的返回类型可以是:各种数据类型、指针类型或voidvoid第四章 函数534.2 参数的传递值调用值调用544.2 参数的传递引用调用引用调用554.3 内联函数函数调用需要建立环境、进行参数传递函数调用需要建立环境、进行参数传递等工作,对于一些简单的函数,可以采等工作,对于一些简单的函数,可以采用内联函数的方式用内联函数的方式使用使用inlineinline关键字定义的函数是内联函关键字定义的函数是内联函数。数。注意:注意:内联函数中不能包含内联函数中不能包含swi
23、tchswitch语句和循环结构,语句和循环结构,也不能声明异常接口。也不能声明异常接口。564.4 重载具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。574.5 带缺省参数值的函数函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。例:void fun(int x,int y=0)void fun(int x)584.6 异常处理基础函数执行过程中出现的不正常情况函数执行过程中出现的不正常情况-异常。异常。函数遇到异常时希望调用者捕获异常并进行处理。函数遇到异常时希望调用者捕获异常并进行处理。595
24、.1类的结构一个对象从使用者的角度看,它具有某些状态并提供了一些方法来操作这些状态。C+的类作为对象的抽象完全体现了这一点。状态-表现为一些数据。方法-表现为一些函数。第五章 类605.1类的结构C+类的说明615.1类的结构举例:625.1类的结构说明:public后声明的是公有数据成员和成员函数,可被任何程序单元引用。private后声明的是私有数据成员和成员函数,仅可被类内部引用。Public和private出现的顺序和次数是任意的。635.1类的结构类成员函数的实现64举例655.2类的实例化-对象的实现66类的实例化-举例675.3构造函数和析构函数构造函数的作用是在对象被创建时使用
25、特定的值构造对象。析构函数的作用是在对象被删除时做一些清理工作。构造函数的特点:与类同名可以重载没有返回值析构函数是类名前加685.3构造函数和析构函数举例695.3构造函数和析构函数举例705.3构造函数和析构函数举例715.4成员函数的内联实现函数体放在类体内。函数体放在类体外,使用inline关键字。725.4成员函数的内联实现735.5带缺省参数值的成员函数和成员函数的重载745.5带缺省参数值的成员函数和成员函数的重载755.5带缺省参数值的成员函数和成员函数的重载76第六章 程序结构对象的三个属性:对象的三个属性:作用域作用域、可见性可见性、生存生存期期静态成员函数与静态数据成员静
26、态成员函数与静态数据成员友员友员77作用域及可见性一个标识符的有效区域。一个标识符的有效区域。分为:函数原型作用域、块作用域、类作分为:函数原型作用域、块作用域、类作用域、文件作用域。用域、文件作用域。78函数原型作用域函数原型中所作的参数声明在该作用域,函数原型中所作的参数声明在该作用域,始于左括号,结束于右括号。始于左括号,结束于右括号。79块作用域块作用域由一对花括号定义。(局部作用块作用域由一对花括号定义。(局部作用域)域)80块作用域81类作用域类内部定义的成员具有类作用域类内部定义的成员具有类作用域82文件作用域全局作用域全局作用域83可见性标识符是否可以引用。标识符是否可以引用。
27、在嵌套作用域中,内层作用域的标识符优在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。先于外层作用域的标识符。C+C+中,标识符必须先声明后引用,在同一中,标识符必须先声明后引用,在同一作用域中不能生命同样的标识符。作用域中不能生命同样的标识符。84可见性举例85对象的生存期静态生存期静态生存期与程序的运行期相同。这种对象的存储单元相与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变对位置在整个程序的运行期间不变文件作用域或用文件作用域或用staticstatic指定。指定。若未显式指定初始值,为零。若未显式指定初始值,为零。动态生存期动态生存期在函数内部(块作用
28、域)声明的对象是动态生在函数内部(块作用域)声明的对象是动态生存期。存期。若未显式指定初始值,为任意值。若未显式指定初始值,为任意值。86对象的生存期举例87数据共享数据存储在局部对象中,通过参数传递机数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。制实现函数间的数据共享。数据存储在全局对象中,通过全局对象进数据存储在全局对象中,通过全局对象进行数据交换。行数据交换。封装在类中。封装在类中。88举例89举例90静态成员函数和静态数据成员全局对象存在的问题全局对象存在的问题可见性无限制可见性无限制不能保证操作的合法性不能保证操作的合法性解决上述问题的方法是类及其封装技术,解决上述问题
29、的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。相应提出静态数据成员和静态成员函数。91举例92举例93举例94举例95举例96友员通过声明通过声明a a模块是模块是b b模块的友员,模块的友员,a a模块可以模块可以引用引用b b模块中的隐藏的信息(私有数据成员模块中的隐藏的信息(私有数据成员和私有成员函数)。这种技术破坏了类的和私有成员函数)。这种技术破坏了类的封装机制。封装机制。声明的语法如下:声明的语法如下:friend friend 函数名函数名(参数列表参数列表););可以声明友员类可以声明友员类97举例9899第七章 编译指令#includeinclude#defin
30、e#define#undef#undef#if#if#else#else#elif#elif#endif#endif#error#error100#include 的两种形式#include include C+C+系统目录下的系统目录下的includeinclude目录目录#include include“my.hmy.h”当前子目录、当前子目录、C+C+系统子目录系统子目录101#define 的两种形式#define define 标识符标识符 替换串替换串#definedefine标识符标识符(参数列表参数列表)替换串替换串102举例:103举例:104举例:105第八章 对象指针和对
31、象数组要构成程序,必须有众多对象要构成程序,必须有众多对象C+C+提供了把众多对象组成更复杂对象的机提供了把众多对象组成更复杂对象的机制:指针和数组制:指针和数组106指针指针:对象的地址指针:对象的地址指针对象:存放指针的对象指针对象:存放指针的对象声明指针对象的语法:声明指针对象的语法:T*T*标识符;标识符;int*pointer;int*pointer;一个指针对象被赋值为一个对象的地址后,一个指针对象被赋值为一个对象的地址后,称指针指向对象。称指针指向对象。107为指针对象引入的两种操作&-&-取地址操作取地址操作*-*-目标操作目标操作108109110111112数组和指针数组:
32、一组类型相同的对象声明语法:类型标识符元素个数;数组元素可以用下标引用数组名index;数组元素也可以用指针引用113数组和指针通过指针引用数组元素定义指针对象数组的地址赋值给指针对象。指针引用数组元素的方法*(pointer+n)pointern114115116117对象数组没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。118举例119引用是标识对象的一种机制(是对象的一个别名)一般用作参数类型、函数返回类型。一般语法如下:基本类型&标识符一个引用不是独立的对象,只是对另一个对象的引用。基本类型&标识符=对象;引用被赋值是其所引用的
33、对象被赋值,而不是引用了新的对象120121122类型表达式由数据类型名与类型修饰符*、&和()所构成的式子称类型表达式。使用typedef可以用一个标识符来命名一个类型表达式。语法如下:Typedef int*Array10;Array a;int*a10;123堆对象在程序运行中根据需要在堆内存中创建的对象,使用完成后随时被删除。创建语法如下:T*ptr=new T(初始值列表);删除语法如下:delete ptr;数组对象的创建int*ptr=new int10;数组对象的删除 delete ptr;124125126127指针数组数组元素的类型是指针,这样的数组称指针数组。语法:T*标
34、识符元素个数;128多维数组与指针多维数组可以解释为其元素是多维数组的一维数组。129this指针一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。130具有子对象的类类型用内部包含子对象的类实现复杂的类子对象的初始化131132133134135第九章 对类的进一步讨论拷贝构造函数拷贝构造函数赋值赋值constconst关键字关键字类型强制类型强制136拷贝构造函数使用一个对象初始化一个正在建立的同类使用一个对象初始化一个正在建立的同类对象。对象。拷贝初始化构造函数的参数是引用参数。拷贝初始化构
35、造函数的参数是引用参数。每个类都一定有一个拷贝初始化构造函数每个类都一定有一个拷贝初始化构造函数如未定义,则编译器自动生成一个。如未定义,则编译器自动生成一个。功能:功能:用作为初始值的对象的每个数据成员初始化正用作为初始值的对象的每个数据成员初始化正建立对象的对应的数据成员。建立对象的对应的数据成员。137138以值调用方式传递参数时函数返回对象时139赋值当需要进行对象之间的赋值操作时,必须定义赋值操作。为与习惯一致,一般用作为=赋值操作符当使用操作符作为函数名时,必须与关键字operator合用。赋值操作的参数最好用引用方式。140141赋值操作的参数最好采用引用方式。赋值操作的最好返回
36、对被赋值对象的引用。一般形式:X&X:operator=(const X&p);142编译器产生的拷贝初始化和赋值操作的缺陷当类中声明有指针数据成员时,将产生问题。143const关键字是一个类型修饰符,const描述的类型定义的对象是常对象。Int const a=1;int*const p;p-*const-intconst int*a;a-*-const int确定不修改对象的数据成员的成员函数可以定义为const函数。Const成员函数不能更新非静态数据成员,也不能调用没有使用const修饰的成员函数.144第十章 操作符重载当使用操作符来表达对对象的某个操作时,当使用操作符来表达对对
37、象的某个操作时,可以将操作符函数声明为类的成员函数或可以将操作符函数声明为类的成员函数或类的友员函数。类的友员函数。操作符的参数个数、优先级、结合性和使操作符的参数个数、优先级、结合性和使用语法是由用语法是由C+C+规定的,不能被改变。规定的,不能被改变。重载操作符的形参不能具有缺省值。重载操作符的形参不能具有缺省值。重载操作符的返回值类型任意,但最好不重载操作符的返回值类型任意,但最好不是是void void。145一元操作符重载为友员函数时,只能具有一元操作符重载为友员函数时,只能具有一个形参;重载为成员函数时,不能声明一个形参;重载为成员函数时,不能声明形参,所需的一个形参由成员函数的自
38、引形参,所需的一个形参由成员函数的自引用参数提供。用参数提供。二元操作符重载为友员函数时,只能具有二元操作符重载为友员函数时,只能具有两个形参;重载为成员函数时,只能声明两个形参;重载为成员函数时,只能声明一个形参,这个形参表示右操作数,左操一个形参,这个形参表示右操作数,左操作数由成员函数的自引用参数提供。作数由成员函数的自引用参数提供。146重载为类的成员函数147重载为类的成员函数148重载为类的成员函数149重载为类的成员函数150重载为类的友元函数151重载为类的友元函数152重载为类的友元函数153重载为类的友元函数154两种方法的比较一元函数最好重载为成员函数一元函数最好重载为成
39、员函数二元函数一般重载为友元函数二元函数一般重载为友元函数27.5+27.5+x x赋值操作符只能重载为成员函数赋值操作符只能重载为成员函数27.5=27.5=x x+和和-操作符有两种形式,一般被重载为操作符有两种形式,一般被重载为成员函数成员函数其中后缀操作重载后带有一个整型参数。其中后缀操作重载后带有一个整型参数。155两种方法的比较下标操作符只能被重载为成员函数下标操作符只能被重载为成员函数函数调用操作符函数调用操作符156第十一章 继承 通过已有的类进行扩展产生新类的过程通过已有的类进行扩展产生新类的过程产生的新类称派生类产生的新类称派生类产生派生类的类称基类或父类。产生派生类的类称
40、基类或父类。从一个基类派生称单基继承,从多个基类从一个基类派生称单基继承,从多个基类派生称多基继承。派生称多基继承。157派生语法158zMousezScreenzDevicezKeyboardzTreezAppleTreezFruit159访问控制访问控制用语控制基类中声明的名字在多大的范围内能够被派生类的用户访问访问控制有三种public,protected,privatez基类模块z派生类模块z间接派生类模块z其他程序模块160161公有继承162公有继承163私有继承164私有继承165在派生类中访问基类成员166保护的成员对V模块是public对H模块是private167保护的成员
41、168多继承可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。169构造函数和析构函数派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。一般形式如下:C:C(参数表0):C1(参数表1),C2(参数表2),Cn(参数表n)170构造函数和析构函数如果冒号右边的某个基类的构造函数参数表为空,则可以省略该项。构造对象时,先执行基类的构造函数,然后执行派生类的构造函数。析构时则相反。多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中
42、的顺序无关。171构造函数和析构函数172构造函数和析构函数173构造函数和析构函数174构造函数和析构函数175构造函数和析构函数176二义性如果派生类的一个表达式引用基类中不止一个成员,则存在二义性。解决二义性的办法是加类限定符。177二义性178二义性179二义性如果一个派生类是从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的标识符进行访问时可能产生二义性。180二义性zBbzB1b1zCf(),dzBbzB2b2181二义性182虚基类为避免一个基类在多条继承路径上造成在派生类中产生多个基类子对象,可以采用虚基类技术。语法如下class B1:virtual publ
43、ic Bclass B2:virtual public Bclass C:public B1,public B2183派生类的赋值和初始化如未定义拷贝构造函数和赋值操作,则编译器提供。如自定义,则应在实现中调用基类的拷贝构造函数和赋值操作。184第十二章 虚函数与多态性如果类型如果类型S S是从类型是从类型T T共有继承的,则称类共有继承的,则称类型型S S是类型是类型T T的子类型。的子类型。类型类型S S的指针或引用可以适用于类型的指针或引用可以适用于类型T T的指的指针或引用的场合。针或引用的场合。185动态绑定与虚函数由于在基类和派生类中,相同的名字执行的操作可能不同,由于在基类和派生
44、类中,相同的名字执行的操作可能不同,所以基类的成员函数在派生类中经常有不同的实现。所以基类的成员函数在派生类中经常有不同的实现。用用virtualvirtual关键字可以实现动态绑定。关键字可以实现动态绑定。动态绑定只适用于虚函数的参数是指针或引用的情况。动态绑定只适用于虚函数的参数是指针或引用的情况。186动态绑定与虚函数187动态绑定与虚函数188动态绑定与虚函数189动态绑定与虚函数190动态绑定与虚函数在一个成员函数内调用虚函数时,对该虚在一个成员函数内调用虚函数时,对该虚函数的调用进行动态绑定。函数的调用进行动态绑定。派生类中虚函数必须满足下列条件:派生类中虚函数必须满足下列条件:与
45、基类的函数有相同个数的参数与基类的函数有相同个数的参数参数类型相同参数类型相同返回类型或者与基类相同或者返回指针或引用,返回类型或者与基类相同或者返回指针或引用,且返回的指针或引用的基类型是基类中对应函且返回的指针或引用的基类型是基类中对应函数所返回的指针或引用的基类型的子类型。数所返回的指针或引用的基类型的子类型。在一个成员函数内调用虚函数时,对该虚在一个成员函数内调用虚函数时,对该虚函数的调用进行静态绑定。函数的调用进行静态绑定。191纯虚函数与抽象类当定义基类时某个虚函数不能给出确定的当定义基类时某个虚函数不能给出确定的实现时,可以定义其为纯虚函数。实现时,可以定义其为纯虚函数。语法如下语法如下virtual virtual 类型类型 函数名函数名(参数列表参数列表)=0;)=0;具有纯虚具有纯虚成员成员函数的类称为抽象类函数的类称为抽象类;抽象类只能用来派生类而不能定义具体的抽象类只能用来派生类而不能定义具体的对象。对象。192纯虚函数与抽象类193保护的基类公有继承实现一般与特殊的关系而私有继公有继承实现一般与特殊的关系而私有继承可以实现代码的快速集成承可以实现代码的快速集成私有继承的派生类的对象不能作为基类的私有继承的派生类的对象不能作为基类的对象使用对象使用保护的基类可以解决公有和私有的矛盾。保护的基类可以解决公有和私有的矛盾。
限制150内