面向对象程序的设计复习ppt课件_第1页
面向对象程序的设计复习ppt课件_第2页
面向对象程序的设计复习ppt课件_第3页
面向对象程序的设计复习ppt课件_第4页
面向对象程序的设计复习ppt课件_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计面向对象程序设计复习复习C+言言语语程程序序设设计计教教程程 复复习习课课第一章第一章C+言言语语程程序序设设计计教教程程 复复习习课课C+言言语语程程序序设设计计教教程程 第第1章章C+编编程程简简介介1.1 计算机程序设计言语自顶向下,逐渐求精; 面向对象的方法将客观事物描画成具有属性和行为的对象; 同一类对象的共同属性和行为构成类; 封装对象间经过发送和接受音讯发生联络; 类的承继与多态性可以提供运用现成类的机制,从而实现代码的重用. 关键是定义类,并由类实例化成对象C+言言语语程程序序设设计计教教程程 第第1章章C+编编程程简简介介 1 键 盘 cin 执 行 cinX

2、 ; 键 入 123 3 123 内 存 显 示 器 cout 执 行 cout 对象1 对象2.对象n;C+中运用对象cin 作为规范输入流对象,通常代表键盘,cin与提取操作符连用,运用格式为:意思是从规范输入流对象键盘上提取n个数据分别给对象1、对象2、.、对象n。C+ C+ 输入输入/ /输出简介输出简介C+言言语语程程序序设设计计教教程程 第第1章章C+编编程程简简介介 1 键 盘 cin 执 行 cin X ; 键 入 1 23 3 123 内 存 显 示 器 cou t 执 行 co u t X ; X = 123 2 cout 对象1 对象2.对象n;C+中运用对象cout 作

3、为规范输出流对象,通常代表显示设备,cout 与插入操作符n; if(n=1) break; for(i=2;i=n ? coutn是素数n : coutnn; if(n=1) break; for(i=2;i=n ? coutn是素数是素数n : coutn不是素数不是素数n; continue当不是素数,直接跳到第15行继续执行。 程序结果错误。 C+言言语语程程序序设设计计教教程程 第第3章章控控制制构构造造 【例】【例】continue和和break组和例如组和例如3.7.2 continue语句语句第四章第四章C+言言语语程程序序设设计计教教程程 复复习习课课C+言言语语程程序序设设

4、计计教教程程 第第4章章函函数数4.2.3 4.2.3 函数参数的按值传送函数参数的按值传送 函数调用过程实践上执行了一个从参数传送-执行函数体-前往的过程。其中的函数参数传送过程的本质是将实参值经过栈空间一一传送给实参的过程,这种把实参表达式的值传送给对应的形参变量传送方式称为“按值传送。 函数调用 函数定义 返回类型 函数名 (形参 1, 形参 2, ., 形参 n ) 函数体; 栈内存 函数名 (实参1, 实参 2, ., 实参n ); 实参1 的值 实参2 的值 . 实参n 的值 内联函数的定义方式如下: C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.3 4.3 内联函数

5、内联函数 inline 函数类型 函数名 (方式参数表) 函数体; 内联函数:内联函数: 是经过在编译时将函数体代码插入到函数调用途,将调用是经过在编译时将函数体代码插入到函数调用途,将调用函数的方式改为顺序执行方式来节省程序执行的时间开销,这函数的方式改为顺序执行方式来节省程序执行的时间开销,这一过程叫做内联函数的扩展。因此,内联函数实践上是一种用一过程叫做内联函数的扩展。因此,内联函数实践上是一种用空间换时间的方案。空间换时间的方案。但从用户的角度看,调用内联函数和普通函数没有任何区别。 C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.4 4.4 带默许形参值的函数带默许形参值

6、的函数 int sub(int x=8,int y=3) return x-y; void main(void) sub(20,15); /传送给形参传送给形参x,y的值分别为的值分别为20和和15 sub(10); /传送给形参传送给形参x,y的值分别为的值分别为10和和3 sub(); /传送给形参传送给形参x,y的值分别为的值分别为8和和3 C+言语允许在函数阐明或函数定义中为形参预赋一个默许的值,这样的函数就叫做带有默许形参值的函数。在调用带有默许参数值的函数时,假设为相应形参指定了实参,那么形参将运用实参的值;否那么,形参相运用其默许值。这就大大地方便了函数的运用。 C+言言语语程程

7、序序设设计计教教程程 第第4章章函函数数4.5 4.5 函数重载函数重载 int max(int,int);int max(int,int,int);float max(float,float);double max(double,double); 函数重载:函数重载: 就是两个以上的函数,取一样的函数名,但是形参的个数就是两个以上的函数,取一样的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最正确匹和类型不同,编译器根据实参和形参的类型及个数的最正确匹配,自动决议调用哪一个函数。配,自动决议调用哪一个函数。 例如: #includeusing namespace std

8、;int add(int x,int y) cout(int, int)t; return x+y; double add(double x,double y) cout(double, double)t; return x+y; int add(int x,double y) cout(int, double)t; return int(x+y); 123456789101112131415161718192021C+言言语语程程序序设设计计教教程程 第第4章章函函数数函数重载函数重载函数重载函数重载函数重载函数重载double add(double x,int y) cout(double

9、,int)t; return x+y; void main() coutadd(9,8)endl; coutadd(9.0,8.0)endl; coutadd(9,8.0)endl; coutadd(9.0,8)endl; 212223242526272829303132C+言言语语程程序序设设计计教教程程 第第4章章函函数数函数重载函数重载重载函数的调用重载函数的调用C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.5 4.5 函数重载函数重载/ C+无法区分这两个函数。/由于在没有确定函数调用是对哪一个重载的函数之前,/前往类型是不知道的。 int add(int i1,int

10、i2); float add(int f1,int f2);F留意留意:F(1) 各个重载函数的前往类型可以一样,也可以不同。但假各个重载函数的前往类型可以一样,也可以不同。但假设函数名一样、形参表也一样,仅仅是前往类型不同,那么设函数名一样、形参表也一样,仅仅是前往类型不同,那么是非法的。在编译时会以为是语法错误。是非法的。在编译时会以为是语法错误。 C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.5 4.5 函数重载函数重载1、首先寻觅一个严厉的匹配,假设找到了,就调用这个函数。2、假设无严厉匹配的函数,就经过类型的自然转换寻觅一个匹配,假设找到了,就调用这个函数。3、经过用户

11、定义的转换寻觅一个匹配。F留意留意:F(2)确定对重载函数的哪个函数进展调用的过程称为绑定确定对重载函数的哪个函数进展调用的过程称为绑定(binding)函数重载中参数匹配的步骤函数重载中参数匹配的步骤(函数重载解析过程函数重载解析过程)C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.6 4.6 函数模板函数模板 template 前往类型 函数名 (形参表) 函数体; 函数模板:函数模板: 可以用来创建一个通用功能的函数,以支持多种不同可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。形参,进一步简化重载函数的函数体设计。函数模板的定义方式为:函

12、数模板的定义方式为: 模板参数表C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.6 4.6 函数模板函数模板 F意义:意义:F 对于功能完全一样,只是参数类型不同函数,能写一对于功能完全一样,只是参数类型不同函数,能写一段通用代码适用于多种不同的数据类型,会使代码的可重用段通用代码适用于多种不同的数据类型,会使代码的可重用性大大提高,从而提高软件的开发效率。性大大提高,从而提高软件的开发效率。 template 前往类型 函数名 (形参表) 函数体; C+言言语语程程序序设设计计教教程程 第第4章章函函数数4.6 4.6 函数模板函数模板F留意留意:Ftemplate关键字表示声明

13、的是模板。关键字表示声明的是模板。F中是模板的参数表,可以有一项或多项,其中的类型称中是模板的参数表,可以有一项或多项,其中的类型称号为参数化类型,是一种笼统类型或可变类型。号为参数化类型,是一种笼统类型或可变类型。Fclass是类型关键字,也可以用是类型关键字,也可以用typename作为关键字。作为关键字。F函数前往值类型可以是普通类型,也可以是模板参数表中函数前往值类型可以是普通类型,也可以是模板参数表中指定的类型。指定的类型。F模板参数表中的参数类型可以是普通类型。模板参数表中的参数类型可以是普通类型。 template 前往类型 函数名 (形参表) 函数体; C+言言语语程程序序设设

14、计计教教程程 第第4章章函函数数4.6 4.6 函数模板函数模板 template 前往类型 函数名 (形参表) 函数体; template T add(T x, T y) return x+y; template T sum() 第五章第五章C+言言语语程程序序设设计计教教程程 复复习习课课5.2.5 字符数组与字符串字符数组与字符串 存放字符型数据的数组称为字符数组。字符数组也分为一维数组和多维数组。前述的数组的定义及初始化同样适用于字符数组,除此以外,C+对字符数组的初始化还可以运用字符串方式。 1.用字符进展初始化 例如: char s1 =C,h,i,n,a; char s2 4=H

15、,o,w,a,r,e,y,o,u; 2.用字符串进展初始化 例如: char s3 =China; char s4 4=how, are, you; C+言言语语程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型3. 字符数组的运用字符数组的运用 字符数组也是数组,我们同样可以经过数组名及下标援用字符数组也是数组,我们同样可以经过数组名及下标援用数组中的元素。数组中的元素。 为方便对字符与字符串的处置,为方便对字符与字符串的处置,C+提供了许提供了许多专门处置字符与字符串的函数,这些函数原型在各自的头文多专门处置字符与字符串的函数,这些函数原型在各自的头文件中定义。件中定义。 下表列

16、出了常用的字符与字符串处置函数的调用方法与功下表列出了常用的字符与字符串处置函数的调用方法与功能简介,函数原形与详细的功能可以从能简介,函数原形与详细的功能可以从C+编译器的协助文档编译器的协助文档中获得。中获得。C+言言语语程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2.5 字符数组与字符串字符数组与字符串 5.3.6 指针与函数指针与函数 1 1、指针作为函数参数、指针作为函数参数【例【例5-85-8】用传指针方式实现两个数据交换】用传指针方式实现两个数据交换 分析:用传值的方式无法实现两个数据交换。用分析:用传值的方式无法实现两个数据交换。用指针作为形参,从实参传入要

17、交换数据的地址,在函指针作为形参,从实参传入要交换数据的地址,在函数体内将指针指向的两个数据交换存储位置,这样经数体内将指针指向的两个数据交换存储位置,这样经过过“釜底抽薪的方式实现了数据交换。釜底抽薪的方式实现了数据交换。C+言言语语程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.4.2 援用与函数援用与函数 1. 1. 援用作为函数的参数援用作为函数的参数 当援用作为函数的形参,在进展函数调用时,当援用作为函数的形参,在进展函数调用时,进展实参与形参的结合,其结合过程相当于定义了进展实参与形参的结合,其结合过程相当于定义了一个形参对实参的援用。因此,在函数体内,对形一个形参

18、对实参的援用。因此,在函数体内,对形参进展运算相当于对实参进展运算。与指针相比,参进展运算相当于对实参进展运算。与指针相比,援用作为函数参数具有两个优点:援用作为函数参数具有两个优点: 函数体的实现比指针简单。用指针作为形参,函数体的实现比指针简单。用指针作为形参,函数体内形参要带着函数体内形参要带着* *参与运算;而用援用作为形参,参与运算;而用援用作为形参,函数体内参与运算的为形参变量。函数体内参与运算的为形参变量。 调用函数语法简单。用指针作为形参,实参调用函数语法简单。用指针作为形参,实参需求取变量的地址;而用援用作为形参,与简单传需求取变量的地址;而用援用作为形参,与简单传值调用一样

19、,实参为变量。值调用一样,实参为变量。 C+言言语语程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型第六章第六章C+言言语语程程序序设设计计教教程程 复复习习课课除了按数据类型区分变量外,根据变量定义的位置,可以把变量分成全局变量与部分变量。全局变量是指定义在函数体外部的变量,它能被一切函数运用。部分变量是指定义在函数或复合语句中的变量,只能在函数或复合语句中运用。 int g=100000;int sum(int x, int y) int s=0; for(int i=x;i=y;i+) s=s+i; return s;void main() int x=1,y=100; co

20、utsum(x,y)+gendl;12345678910111213g为全局变量sum()中 x、y为部分变量main()中的 x、y为部分变量C+言言语语程程序序设设计计教教程程 第第6章章C+程程序序的的构构造造 C+中变量有auto 、extern、register、static四种存储类型。1.auto阐明符 auto阐明符阐明定义的是一个部分变量。部分变量默许存储类型为auto, 所以在程序中很少运用auto阐明符阐明。2. register阐明符 register阐明符在定义变量时阐明此变量存储在CPU中的存放器中,以加快存取速度。普通编译器本人选择几个变量采用存放器存储,不需求在

21、程序中声明。C+言言语语程程序序设设计计教教程程 第第6章章C+程程序序的的构构造造6.1.2 6.1.2 变量的存储变量的存储 类类 型型 C+中变量有auto 、extern、register、static四种存储类型。3. extern阐明符 假设一个完好的计算机程序很大,分成多个模块,放在不同的文件中,分开编译成目的文件,最后衔接成一个完好的可执行代码。对于一切模块共同运用的全局变量,假设在一切的模块中都定义,在衔接时就会出错。 处理方法是只在一个模块中定义全局变量,在其他模块中用extern阐明这是一个“外来的全局变量。C+言言语语程程序序设设计计教教程程 第第6章章C+程程序序的的

22、构构造造6.1.2 6.1.2 变量的存储变量的存储 类类 型型6.1.2 6.1.2 变量的存储变量的存储 类类 型型4. static阐明符阐明符static阐明符用于在定义变量时将变量声明为成阐明符用于在定义变量时将变量声明为成static(静态静态)变量。变量。 其格式为:其格式为: static 数据类型数据类型 变量名变量名=初值;初值; F留意留意:F 当一个部分变量声明为当一个部分变量声明为static变量,它既具有部分变量的变量,它既具有部分变量的性质:只能在函数体部分存取;又具有全局变量的性质:函性质:只能在函数体部分存取;又具有全局变量的性质:函数多次进入,变量的值只初始

23、化一次。因此静态部分变量本数多次进入,变量的值只初始化一次。因此静态部分变量本质是一个供函数部分存取的全局变量。质是一个供函数部分存取的全局变量。 C+言言语语程程序序设设计计教教程程 第第6章章C+程程序序的的构构造造6.1.3 6.1.3 变量在内存中的存储变量在内存中的存储 全局变量、静态变量、字符串常量、常变量存放在全局数据区;一切的函数和代码存放在代码区;为运转函数而分配的函数参数、部分变量、前往地址存放在栈区;堆区用于动态内存分配。 变量的生存期为从产生到消逝的时期。全局变量、静态变量、常变量生存周期为整个程序的生存周期,因此称为静态生存期;部分变量的生存周期起于函数调用,终了于函

24、数调用终了,其生存期是动态的,因此称为动态生存期。C+言言语语程程序序设设计计教教程程 第第6章章C+程程序序的的构构造造6.3 6.3 程序的文件构造与编译预处置命令程序的文件构造与编译预处置命令 一个高级言语源程序在计算机上运转,必需先用编译程序将其翻译为机器言语。在编译之前还要做某些预处置任务,如去掉注释,变换格式等。C+源程序中以#开头、以换行符结尾的行称为预处置命令。预处置命令不是C+言语的语法成分,在编译前由预处置器执行,在目的程序中,不含预处置指令对应的机器码。因此,预处置命令不以分号结尾。许多预处置命令更适宜程序员,但为了处置C遗留的代码,C+编程者也应该熟习预处置命令。 C+

25、言言语语程程序序设设计计教教程程 第第6章章C+程程序序的的构构造造6.4 6.4 名字空间名字空间 一个软件往往由多个模块(组件)组成,这些模块由不同程序员(软件商)提供,不同模块能够运用了一样的标识符。简单说就是同一个名字在不同模块中代表不同的事物。当这些模块用到同一个程序中,同名标识符就引起冲突。C+提供名字空间(namespace) 将一样的名字放在不同空间中来防止命名冲突。 定义一个名字空间的格式如下: 其中:namespace 为关键字。称号为名字空间标识符。成员为函数、变量、常量、自定义类型等。 namespace 称号 成员; C+言言语语程程序序设设计计教教程程 第第6章章C

26、+程程序序的的构构造造第七章第七章C+言言语语程程序序设设计计教教程程 复复习习课课在面向对象的程序设计中,程序模块是由类构成的。类是对逻辑上相关的函数与数据的封装,它是对问题的笼统描画。数据封装就是将一组数据和与这组数据有关操作组装在一同,构成一个实体,这实体也就是类。类与对象是C+程序设计中最重要的概念。 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象void main(void) Clock MyClock; MyClock.ShowTime(); MyClock.SetTime(8,30,30); MyClock.ShowTime();* p7_1_b.cpp * 面

27、向对象的时钟程序 */#include using namespace std;class Clock private: int H,M,S; public: void SetTime(int h,int m,int s) H=(h=0&h=0&m=0&s60)?s:0; void ShowTime() coutH:M:Sendl; ;123456789101112131415161718192021222324252627时钟程序时钟程序B时钟程序时钟程序BC+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象例如:例7-1中定义了一个时钟类Clock。 C

28、+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象1. 数据成员数据成员 类定义中的数据成员描画了类对象所包含的数类定义中的数据成员描画了类对象所包含的数据类型,数据成员的类型可以是据类型,数据成员的类型可以是C+根本数据类型,根本数据类型,也可以是构造数据类型。也可以是构造数据类型。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象class Team; /已定义的类class Grade Team a; / 运用了已定义的类类型 Grade *p; / 运用正在定义的类类型定义指针成员 Grade &r; / 运用正在定义的类类型定义援用成员 Grade

29、b; / 错误! 运用了未定义完的类Record 定义变量; F留意留意:F 由于类只是一种类型,类中的数据成员不占内存空间,因由于类只是一种类型,类中的数据成员不占内存空间,因此在定义数据成员时不能给数据成员赋初值。此在定义数据成员时不能给数据成员赋初值。F 类的数据成员除了可以运用前面讲述的类的数据成员除了可以运用前面讲述的C+类型外,还可类型外,还可以运用已定义完好的类类型。以运用已定义完好的类类型。F 在正在定义的类中,由于该类型没有定义完好,所以不能在正在定义的类中,由于该类型没有定义完好,所以不能定义该类类型的变量,只能定义该类类型的指针成员以及该定义该类类型的变量,只能定义该类类

30、型的指针成员以及该类类型的援用成员。类类型的援用成员。 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象2. 成员函数成员函数 作为类成员的成员函数描画了对类中的数据成员实施的作为类成员的成员函数描画了对类中的数据成员实施的操作。成员函数的定义、声明格式与非成员函数操作。成员函数的定义、声明格式与非成员函数(全局函数全局函数)的格式一样。成员函数可以放在类中定义,也可以放在类外。的格式一样。成员函数可以放在类中定义,也可以放在类外。放在类中定义的成员函数为内联放在类中定义的成员函数为内联(inline)函数。函数。 Clock类中的成员函数就是放在类内定义的。类中的成员函数就是

31、放在类内定义的。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象2. 成员函数成员函数 C+可以在类内声明成员函数的原型,在类外定义函数可以在类内声明成员函数的原型,在类外定义函数体。这样做的益处是相当于在类内列了一个函数功能表,使体。这样做的益处是相当于在类内列了一个函数功能表,使我们对类的成员函数的功能一目了然,防止了在各个函数实我们对类的成员函数的功能一目了然,防止了在各个函数实现的大堆代码中查找函数的定义。在类中声明函数原型的方现的大堆代码中查找函数的定义。在类中声明函数原型的方法与普通函数原型的声明一样,在类外定义函数体的格式如法与普通函数原型的声明一样,在类外定义函

32、数体的格式如下:下: :是类的作用域分辨符,用在此处,放在类名后成员函是类的作用域分辨符,用在此处,放在类名后成员函数前,阐明后面的成员函数属于前面的那个类。数前,阐明后面的成员函数属于前面的那个类。前往值类型 类名 : 成员函数名(形参表) 函数体;C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象3. 类作用域类作用域 类是一组数据成员和函数成员的集合,类作用域作用于类类是一组数据成员和函数成员的集合,类作用域作用于类中定义的特定的成员,包括数据成员与成员函数,类内的每一中定义的特定的成员,包括数据成员与成员函数,类内的每一个成员都具有类作用域。实践上,类的封装作用也就是限制

33、类个成员都具有类作用域。实践上,类的封装作用也就是限制类的成员其访问范围局限于类的作用域之内。的成员其访问范围局限于类的作用域之内。 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象类相当于一种包含函数的自定义数据类型,它不占内存,是一个笼统的“虚体,运用已定义的类建立对象就像用数据类型定义变量一样。对象建立后,对象占据内存,变成了一个“实体。类与对象的关系就像数据类型与变量的关系一样。其实,一个变量就是一个简单的不含成员函数的数据对象。建立对象的格式如下:其中,对象名可以是简单的标识符,也可以是数组。在例7-1中,运用:Clock MyClock; 建立了一个Clock型的对

34、象MyClock。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象类名 对象名;经过设置成员的存取控制属性, 使对类成员的存获得到控制,从而到达了信息隐藏的目的。C+的存取控制属性有:公有类型(public)、私有类型(private)和维护类型(protected)。三者的意义如下:表7-1 存取控制属性表 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象存取属性存取属性意意 义义可存取对象可存取对象public 公开(公有)级 该类成员以及所有对象protected 保护级 该类及其子类成员 private 私有级该类的成员 类中定义为public等级的成员

35、,可以被该类的任何对象存取,适用于完全公开的数据。而private等级的成员只可被类内的成员存取,适用于不公开的数据。至于protected等级,属于半公开性质的数据,定义为protected等级的成员,可以被该类及其子类存取。关于子类的概念,在以后的章节中讲述。 在定义一个对象的同时,希望能给它的数据成员赋初值对象的初始化。在特定对象运用终了时,还经常需求进展一些清理任务。C+程序中类的初始化和清理任务分别由两个特殊的成员函数来完成,它们就是构造函数和析构函数。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2 7.2 构造函数与析构函数构造函数与析构函数构造函数构造函数

36、(constructor)构造函数是与类名一样的,在建立对象时自动调用的函数。构造函数是与类名一样的,在建立对象时自动调用的函数。假设在定义类时,没有为类定义构造函数,编译系统就生成一假设在定义类时,没有为类定义构造函数,编译系统就生成一个默许方式的隐含的的构造函数,这个构造函数的函数体是空个默许方式的隐含的的构造函数,这个构造函数的函数体是空的,因此默许构造函数不具备任何功能。的,因此默许构造函数不具备任何功能。假设用户至少为类定义了一个构造函数,假设用户至少为类定义了一个构造函数,C+就不会生成就不会生成任何默许的构造函数,而是根据对象的参数类型和个数从用户任何默许的构造函数,而是根据对象

37、的参数类型和个数从用户定义的构造函数中选择最适宜的构造函数完成对该对象的初始定义的构造函数中选择最适宜的构造函数完成对该对象的初始化。化。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2.1 7.2.1 构造函数构造函数构造函数构造函数(constructor)作为类的成员函数,构造函数可以直接访问类的一切数据作为类的成员函数,构造函数可以直接访问类的一切数据成员,可以是内联函数,可以不带任何参数,可以带有参数表成员,可以是内联函数,可以不带任何参数,可以带有参数表以及默许形参值,还可以重载,用户可以根据不同问题的详细以及默许形参值,还可以重载,用户可以根据不同问题的详细

38、需求,有针对性地设计适宜的构造函数将对象初始化为特定的需求,有针对性地设计适宜的构造函数将对象初始化为特定的形状。形状。 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2.1 7.2.1 构造函数构造函数构造函数是类的一个成员函数,除了具有普通成员函数的特征之外,还归纳出如下特殊的性质:构造函数的函数名必需与定义它的类同名。构造函数没有前往值。假设在构造函数前加void是错误的。构造函数被声明定义为公有函数。构造函数在建立对象时由系统自动调用。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2.1 7.2.1 构造函数构造函数自然界万物都是有生有灭,程

39、序中的对象也是一样。对象在定义时诞生,不同生存期的对象在不同的时期消逝。在对象要消逝时,通常有一些善后任务需求做, 例如:构造对象时,经过构造函数动态恳求了一些内存单元,在对象消逝之前就要释放这些内存单元。C+用什么来保证这些善后去除任务的执行呢?答案是:析构函数。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2.2 7.2.2 析构函数析构函数拷贝构造函数是与类名一样,形参是本类的对象的援用的拷贝构造函数是与类名一样,形参是本类的对象的援用的函数,在用已存在对象初始化新建立对象时调用。函数,在用已存在对象初始化新建立对象时调用。类的拷贝构造函数普通由用户定义,假设用户没

40、有定义拷类的拷贝构造函数普通由用户定义,假设用户没有定义拷贝构造函数,系统就会自动生成一个默许函数,这个默许拷贝贝构造函数,系统就会自动生成一个默许函数,这个默许拷贝构造函数的功能是把初始值对象的每个数据成员的值依次复制构造函数的功能是把初始值对象的每个数据成员的值依次复制到新建立的对象中。因此,也可以说是完成了同类对象的克隆到新建立的对象中。因此,也可以说是完成了同类对象的克隆(Clone)。这样得到的对象和原对象具有完全一样的数据成员,。这样得到的对象和原对象具有完全一样的数据成员,即完全一样的属性。即完全一样的属性。 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2

41、.3 7.2.3 拷贝构造函数拷贝构造函数( (复制构造函数复制构造函数) )浅拷贝,即直接将原对象的数据成员值依次拷贝浅拷贝,即直接将原对象的数据成员值依次拷贝给新对象中对应的数据成员给新对象中对应的数据成员,并没有为新对象另外分配并没有为新对象另外分配内存资源。这样,假设对象的数据成员是指针,两个内存资源。这样,假设对象的数据成员是指针,两个指针对象实践上指向的是同一块内存空间。指针对象实践上指向的是同一块内存空间。当类的数据成员中有指针类型时,我们就必需定当类的数据成员中有指针类型时,我们就必需定义一个特定的拷贝构造函数,该拷贝构造函数不仅可义一个特定的拷贝构造函数,该拷贝构造函数不仅可

42、以实现原对象和新对象之间数据成员的拷贝,而且可以实现原对象和新对象之间数据成员的拷贝,而且可以为新的对象分配单独的内存资源,这就是深拷贝构以为新的对象分配单独的内存资源,这就是深拷贝构造函数。造函数。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.2.4 7.2.4 浅拷贝与深拷贝浅拷贝与深拷贝对象数组是以对象为元素的数组。对象数组的定义、赋对象数组是以对象为元素的数组。对象数组的定义、赋值、援用与普通数组一样,只是数组元素与普通数组的数组元值、援用与普通数组一样,只是数组元素与普通数组的数组元素不同。素不同。对象数组定义格式如下:对象数组定义格式如下: 其中,类名指出该数

43、组元素所属的类,常量表达式给出其中,类名指出该数组元素所属的类,常量表达式给出某一维元素的个数。某一维元素的个数。C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象类名类名 对象数组名对象数组名常量表达式常量表达式n,.,常量表达式常量表达式1; 7.3.3 7.3.3 对象数组对象数组与构造数组不同,对象数组初始化需求运用构造函数完成,以一个大小为n的一维数组为例,对象数组的初始化格式如下:C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象数组名n= 构造函数(数据成员1初值,数据成员2初值,), 构造函数(数据成员1初值,数据成员2初值,), 构造函数(数据成员

44、1初值,数据成员2初值,);F留意:不带初始化表的对象数组,其初始化靠调用不带参数留意:不带初始化表的对象数组,其初始化靠调用不带参数的构造函数完成。的构造函数完成。 7.3.3 7.3.3 对象数组对象数组一个类对象的public成员可被本类的其他对象存取,即可供一切对象运用,但是此类的每个对象都各自拥有一份,不存在真正意义上的共享成员。所以,C+提供了静态成员,用以处理同一个类的不同对象之间数据成员和函数的共享问题。静态成员的特点是:不论这个类创建了多少个对象,其静态成员在内存中只保管一份拷贝,这个拷贝为该类的一切对象所共享。类的静态成员有两种:静态数据成员和静态函数成员,下面分别对它们进

45、展讨论 C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象7.4 7.4 静态成员静态成员C+言言语语程程序序设设计计教教程程 第第7章章类类与与对对象象数据隐藏给不同类和对象的成员函数之间,类的成员函数和类外的普通函数之间进展属性共享带来妨碍,必需寻求一种方法使得类外的对象可以访问类中的私有成员,提高程序的效率。为理处理这个问题,C+提出了运用友元作为实现这一要求的辅助手段。友元不是类的成员,但它可以访问类的任何成员包括私有成员。声明为友元的外界对象既可以是另一个类的成员函数,也可以是不属于任何类的普通的函数,称之为友元函数;友元也可以是整个的一个类,称之为友元类。7.5 7.

46、5 友元友元第八章第八章C+言言语语程程序序设设计计教教程程 复复习习课课8.1 8.1 承继与派生承继与派生 在C+中,可以利用已有的类来定义新的类,新类将拥有原有类的全部特性,原有类被称为基类(Base class)或父类(Super class),新产生的类被称为派生类(Derived class)或子类(Sub class)。派生类拥有基类的特性称作承继,由基类产生派生类的过程称为派生。 8.1.1 承继的概念承继的概念C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生8.1 8.1 承继与派生承继与派生 8.1.1 承继的概念承继的概念假设每一个派生类都有且仅有一个

47、基类,派生类可以看作是基类的特例,它添加了某些基类所没有的性质。这种承继方式,称为单承继或单向承继。现实生活中,子女的外貌、血型往往不是仅仅承继自父亲或母亲,而是将父母亲的特点都承继下来。与之相类似,假设一个派生类有两个或两个以上的基类,那么称为多承继或多重承继。 派生类又作为基类,继续派生新的类, 这样的派生方式称为多层派生,从承继的角度看称为多层承继。C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生 8.1.1 承继的概念承继的概念8.1 8.1 承继与派生承继与派生 class Clock priva

48、te: int H,M,S; public: void SetTime(int H=0,int M=0,int S=0); void ShowTime(); Clock(int H=0,int M=0,int S=0); Clock();class AlarmClock: public Clockprivate: int AH,AM; /响铃的时间响铃的时间 bool OpenAlarm; /是否关闭闹钟是否关闭闹钟public: SetAlarm(int AH, int AM); /设置响铃时间设置响铃时间 SwitchAlarm(bool Open=true); /打开打开/关闭闹铃关闭闹

49、铃 ShowTime(); /显示当前时间与闹铃时间显示当前时间与闹铃时间C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生【例如】在普通的时钟类Clock根底上派生出闹钟类AlarmClock:类 名成 员 名AlarmClock:Clock:H, M, SSetTime()ShowTime()AH, AM, OpenAlarmSetAlarm()SwitchAlarm()ShowTime()AlarmClock()派生类派生类AlarmClock的成员构成图的成员构成图(表表) 8.1 8.1 承继与派生承继与派生 8.1.2 派生类实现派生类实现C+言言语语程程序序设设

50、计计教教程程 第第8章章承承继继与与派派生生 承继描画的是普通类与特殊类的关系,类与类之间表达的是“is a kind of,即假设在逻辑上A是B的一种is a kind of,那么允许A承继B的功能和属性。例如汽车automobile是交通工具(vehicle的一种,小汽车car是汽车的一种。那么类automobile可以从类vehicle派生,类car可以从类automobile派生得到。8.1 8.1 承继与派生承继与派生 8.1.3 承继与组合承继与组合C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生 组合描画的是整体与部分的关系,类与类之间表达的是“is a pa

51、rt of,即假设在逻辑上A是B的一部分is a part of,那么允许A和其他数据成员组合为B。例如:发动机、车轮、电池、车门、方向盘、底盘都是小汽车的一部分,它们组合成汽车。而不能说发动机是汽车的一种。8.1 8.1 承继与派生承继与派生 8.1.3 承继与组合承继与组合C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生 基类的公有成员在派生类中依然为公有成员,可基类的公有成员在派生类中依然为公有成员,可以由派生类对象和派生类成员函数直接访问。以由派生类对象和派生类成员函数直接访问。 基类的私有成员在派生类中,无论是派生类的成基类的私有成员在派生类中,无论是派生类的成员

52、还是派生类的对象都无法直接访问。员还是派生类的对象都无法直接访问。 维护成员在派生类中仍是维护成员,可以经过派维护成员在派生类中仍是维护成员,可以经过派生类的成员函数访问,但不能由派生类的对象直接生类的成员函数访问,但不能由派生类的对象直接访问。访问。公有方式承继的特点:公有方式承继的特点: F留意留意:F对基类成员的访问,一定要分清是经过派生类对象访问还是对基类成员的访问,一定要分清是经过派生类对象访问还是经过派生类成员函数访问。经过派生类成员函数访问。 8.2 8.2 承继的方式承继的方式 8.2.1 公有承继公有承继C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生基类

53、的公有成员和维护成员被承继后作为派生类的基类的公有成员和维护成员被承继后作为派生类的私有成员,即基类的公有成员和维护成员被派生类吸私有成员,即基类的公有成员和维护成员被派生类吸收后,派生类的其他成员函数可以直接访问它们,但收后,派生类的其他成员函数可以直接访问它们,但是在类外部,不能经过派生类的对象访问它们。是在类外部,不能经过派生类的对象访问它们。 基类的私有成员在派生类中不能被直接访问。无论基类的私有成员在派生类中不能被直接访问。无论是派生类的成员还是经过派生类的对象,都无法访问是派生类的成员还是经过派生类的对象,都无法访问从基类承继来的私有成员。从基类承继来的私有成员。 8.2 8.2

54、承继的方式承继的方式 8.2.2 私有承继私有承继私有方式承继的特点:私有方式承继的特点: C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生经过私有承继之后,一切基类的成员都成为了派生经过私有承继之后,一切基类的成员都成为了派生类的私有成员或不可访问的成员,假设进一步派生的类的私有成员或不可访问的成员,假设进一步派生的话,基类的全部成员将无法在新的派生类中被访问。话,基类的全部成员将无法在新的派生类中被访问。因此,私有承继之后,基类的成员再也无法在以后的因此,私有承继之后,基类的成员再也无法在以后的派生类中发扬作用,实践是相当于中止了基类的继续派生类中发扬作用,实践是相当于

55、中止了基类的继续派生,出于这种缘由,普通情况下私有承继的运用比派生,出于这种缘由,普通情况下私有承继的运用比较少。较少。 8.2 8.2 承继的方式承继的方式 8.2.2 私有承继私有承继私有方式承继的特点:私有方式承继的特点: C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生8.2 8.2 承继的方式承继的方式 8.2.3 维护承继维护承继维护成员的特点:维护成员的特点: 基类中基类中protected的成员的成员1、类内部:可以访问、类内部:可以访问2、类的运用者:不能访问、类的运用者:不能访问3、类的派生类成员:可以访问、类的派生类成员:可以访问维护成员的例如维护成员

56、的例如 C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生基类的公有成员和维护成员被承继后作为派生类基类的公有成员和维护成员被承继后作为派生类的维护成员。的维护成员。 基类的私有成员在派生类中不能被直接访问。基类的私有成员在派生类中不能被直接访问。 8.2 8.2 承继的方式承继的方式 8.2.3 维护承继维护承继维护方式承继的特点:维护方式承继的特点: 1.派生类构造函数的定义派生类构造函数的定义C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生派生类名派生类名(参数总表参数总表): 基类名基类名1(参数表参数表1),.,基类名基类名m (参数表参数表m)

57、,成员对象名成员对象名1(成员对象参数表成员对象参数表1),.,成员对象名成员对象名n(成员对象参数成员对象参数表表n) 派生类新增成员的初始化;派生类新增成员的初始化; 基类名1(参数表1),.,基类名m (参数表m)称为基类成员的初始化表。 成员对象名1(成员对象参数表1),.,成员对象名n(成员对象参数表n) 为成员对象的初始化表。基类成员的初始化表与成员对象的初始化表构成派生类构造函数的初始化表。8.3 8.3 派生类的构造与析构派生类的构造与析构 C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生在派生类构造函数的参数总表中,需求给出基类数据成员的初值、成员对象数据

58、成员的初值、新增普通数据成员的初值。在参数总表之后,列出需求运用参数进展初始化的基类名、成员对象名及各自的参数表,各项之间运用逗号分隔。8.3 8.3 派生类的构造与析构派生类的构造与析构 1.派生类构造函数的定义派生类构造函数的定义派生类名派生类名(参数总表参数总表): 基类名基类名1(参数表参数表1),.,基类名基类名m (参数表参数表m),成员对象名成员对象名1(成员对象参数表成员对象参数表1),.,成员对象名成员对象名n(成员对象参数成员对象参数表表n) 派生类新增成员的初始化;派生类新增成员的初始化; C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生基类名、对象名

59、之间的次序无关紧要,它们各自出现的顺序可以是恣意的。在生成派生类对象时,程序首先会运用这里列出的参数,调用基类和成员对象的构造函数。8.3 8.3 派生类的构造与析构派生类的构造与析构 1.派生类构造函数的定义派生类构造函数的定义派生类名派生类名(参数总表参数总表): 基类名基类名1(参数表参数表1),.,基类名基类名m (参数表参数表m),成员对象名成员对象名1(成员对象参数表成员对象参数表1),.,成员对象名成员对象名n(成员对象参数成员对象参数表表n) 派生类新增成员的初始化;派生类新增成员的初始化; C+言言语语程程序序设设计计教教程程 第第8章章承承继继与与派派生生 调用基类构造函数

60、;调用基类构造函数; 调用内嵌成员对象的构造函数,调用顺序按照它们调用内嵌成员对象的构造函数,调用顺序按照它们在类中定义的顺序在类中定义的顺序 。 派生类本人的构造函数。派生类本人的构造函数。 单承继时,派生类构造函数调用的普通次序如下: 当派生类对象析构时,各析构函数的调用顺序正好当派生类对象析构时,各析构函数的调用顺序正好相反。首先调用派生类析构函数相反。首先调用派生类析构函数(清理派生类新增成清理派生类新增成员员);然后调用派生类成员对象析构函数;然后调用派生类成员对象析构函数(清理派生类清理派生类新增的成员对象新增的成员对象);最后调用基类析构函数;最后调用基类析构函数(清理从基清理从基类承继来的基类子对象类承继来

温馨提示

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

评论

0/150

提交评论