919090-C++程序设计教程-第5章 类和对象
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.1
对象与外部对象的每一个交互都称为对象 的行为。对象的行为包括该对象向别的对象
发送消息以及该对象接受别的对象的消息。
消息是对象之间相互请求或相互协作的途
径,是要求某个对象执行其中某个功能操作 的规格的说明。
对象的行为可分为内部行为和外部行为, 相应于消息可分为私有消息和公有消息。
所有公有消息的结合称为该对象的协议,
面向对象方法学将对象定义为:对象是一个逻辑
实体,它是对一组信息以及作用于这些信息的操作 的描述。也就是说,对象是将其自身所固有的状态 特征或属性与可以对这些状态施加的操作结合在一 起所构成的独立实体。
5.1
对象的特性: (1)有一个名字作为该对象在系统中的标识 (2)有一组描述它的特征的状态。 (3)有一组操作。 根据开发过程的不同,可将对象分为三种 不同类型的对象: 现实生活中存在的实体:是我们所模拟系 统的原始构成; 问题对象:对象在问题中的抽象,它是现 实对象在计算机解空间中的直接映射; 计算机对象:问题对象在计算机中的表示 ,即问题对象的计算机实现。
对于用户自定义的函数,要先完成函数的定义, 然后才可以调用它。根据函数定义和使用时参数的 不同,可将函数分为两类:无参函数和有参函数。
无参函数就是没有任何参数的函数,而有参函数 就是带有一个或一个以上参数的函数。
5.3
1、无参函数
定义无参函数的一般格式为:
《<类型>》<函数名>(《void》)
{ …}
5.3
函数调用swap(&a, &b)示意图(a, b为一般变 量):
在调用参数为引用类型的函数时,引用类 型的形参所对应的实参必须为变量。
5.3
在调用引用类型参数的函数时,对引用类 型的参数的操作实际上就是对传递给它的实 参的操作,而不需要将实参拷贝一个副本给 形参。因为从程序的执行效率上看,引用作 为参数,在运行过程中可以节省资源。通常 将占用存储空间较大的类型的形参设置为引 用类型。
在创建对象的同时可以对它的公有成员数 据用初始化列表法进行初始化。
当用一个类创建多个对象时,编译系统分 别为各对象中的成员数据分配存储空间,而 这些对象的成员函数的代码却是共享的。
5.2
对象的使用主要体现在对其成员的引用上 ,对象只能访问公有成员,一般格式为:
<对象名> . <公有成员数据名> 或
函数包括用户自定义函数和系统库函数。
库函数也称为标准函数,是在C++编译系统中已经
预先定义的函数。
在程序设计过程中,用户可根据自己的需要将一 段完成功能相对独立的代码定义为一个函数,这类
函数称为用户自定义函数。
从函数的形式来看,函数可以分为无参函数、有 参函数、无返回值函数和有返回值函数等。
5.3
5.3 成员函数
函数是具有特定功能的模块。一般情况下,编译 时编译系统为函数产生一个接口,以供程序的其它 部分使用。函数可以在类中定义,称为成员函数, 也可在类外定义,称为全局函数。
5.3
一、函数的定义和调用
函数是具有特定功能的模块。在编译过程中,编 译系统为函数产生一个接口,以供程序的其它部分 使用。
在定义类的对象时,系统将为该对象分配 一定的内存空间。
ቤተ መጻሕፍቲ ባይዱ 5.2
定义类的对象的方法与定义结构类型变量 的方法类似,最常用的方法是先定义类,再 定义对象,一般格式为:
存储类型》<类名><对象名1>《,<对象名2>,…》;
还有其他两种对象的方法:在定义类的同 时定义对象;在定义类的同时定义对象,但 省去类名。
称为对象成员。
5.2
三、对象数组和对象指针 定义一维对象数组的一般格式为:
《存储类型》<类名><对象数组名>[<常量表达式>];
对象数组中的每个元素可以象一般的对象 使用。
注意,在说明对象数组时,不能对它进行 初始化。对象数组的元素通过缺省构造函数 而得到初始化。
5.2
定义指针类型的对象的一般格式为: 《存储类型》<类名>*<对象名1>,*<对象名2>,…》;
C++实用教程
第五章 类和对象
章韵等
高等教育出版社
第 5 章 类和对象
5.1 对象 5.2 类的定义和使用 5.3 成员函数 5.4 函数重载 5.5 函数的嵌套与递归 5.6 构造函数与析构函数 5.7 作用域与存储类型 5.8 友元函数
5.1 对象
从广义上讲,人们所关心的事物都是对象,它是 信息系统所针对的问题域中的人、地点和事物等概 念的抽象。
它说明了对象能干什么,能提供什么服务, 以及如何才能得到服务。
5.2 类的定义和使用
类是具有共同特点的一组对象的抽象,它提取该
组对象的共同属性和操作,从抽象层次描述这组对 象。
类是创建对象的模板,以操作、表示和算法的形 式(更一般地讲,是全部的内部和外部行为)完整地 定义了一组对象的行为,类可以被认为是一种用户 自定义的数据类型。
另外,对于函数名重载,一般类型的参数 和同类型的引用参数不能作为判断参数不同 的标准。
5.3
3、地址传递
当指针或数组作为函数参数时,实参向形 参传递的是地址,称为地址传递。在函数执 行过程中,可以对该参数指针所指向的数据 或数组中的数据进行处理。由于此时形参和 实参都是指向同一个存储单元,因此当形参 的数据改变时,实参的数据也作相应的改变 ,此时的形参可以作为输出参数使用。
5.2
类中的成员具有类作用域,即成员的有效
范围为整个类体,类的成员函数可以访问类
中的任何成员,且不受位置的限制,即在类 中先定义的成员函数可以访问后定义的其它 成员。
5.2
二、对象的声明与使用
类是一种导出型数据类型,或称用户自定 义的数据类型,在定义类之后就可以用它来
说明变量,具有类类型的变量称为类的对象 ,或者称为类的实例。
<对象名>.<公有成员函数名>(<参数表>)
这里的符号“.”称为成员选择运算符。
对象只能通过公有成员函数间接地访问其 私有成员或保护成员。
5.2
在使用对象的过程中,要注意以下几点: (1)可用成员选择运算符“.”来访问对象的 公有成员。 (2)同类型的对象之间可以整体赋值。 (3)对象可用作函数的参数,此时属于值调 用;函数的返回值也可以为对象。 (4)一个类的对象可作为另一个类的成员,
功能的模块和一种代码共享的手段。
5.2
一、定义类
定义类的一般格式为:
class <类名>{ 《《private:》 <私有成员数据和成员函数〉;》 《public: <公有成员数据和成员函数〉;》 《protected: <保护成员数据和成员函数〉;》
};
5.2
其中,一对大括号内是类的说明部分,称
可以用new运算符为对象指针动态分配内存空间, 一般格式为:
<对象指针名>=new <类名>(<参数表>); 动态分配的内存空间必须用delete运算符撤消, 一般格式为:
delete <对象指针名>; 对象指针访问其内部的公有成员的一般格式为:
<对象指针名>-><公有成员数据名>; 或 <对象指针名>-><公有成员函数名>(<参数表>);
(1) 对于有返回值的函数,可以用两种方式调用 :一种方式是函数调用出现在表达式中;另一种方 式是用一个语句来实现调用,称为函数调用语句, 此时,函数返回值不起任何的作用。
(2) 对于没有返回值的函数,函数调用只能通过 函数调用语句实现。
5.3
关于形参和实参,有如下几点说明:
(1) 定义函数时指定的形参,在未出现函数调用 时,它们不占用内存中的存储单元。只有在函数调 用时,形参才被分配内存单元,在调用结束后,形 参所占的内存单元也被释放。
通过类可以产生同类型的其它对象(实例),对 象可以看成是类的实例化。
类可以作为面向对象系统的具有特定功能一个模 块,可以作为模块划分的一种手段和依据。
5.2
从语言角度讲,类是一种自定义的数据类 型,其中既包含有描述其属性的数据,又有处 理这些数据的操作(函数),它是C++封装的基 本手段。
在程序的构成上,类形成了一个具有特定
其中,<形参表>为该函数的参数的类型和名字,<
形参表>中的参数称为形式参数或形参,形参的个数
是没有限制的,当超过一个参数时,参数间一定要 用逗号”,”分隔开,且每个参数都要有类型说明。
5.3
二、函数的调用 函数的功能是通过在程序中对其调用来实现的。 调用一个函数,就是把控制权转去执行该函数的
函数体,函数体执行完之后,再将控制权转到调用 函数处。
无参函数的调用格式一般为: <函数名>( )
有参函数的调用格式一般为: <函数名>(<实参表>)
<实参表>中的参数称为实际参数或实参。
5.3
函数的调用过程是:先计算各实参表达式的值(对 有参函数),然后将所求的值传递给相应的形参,执 行函数体,执行完毕再返回到函数的调用处,继续 执行其后继语句。
函数调用的使用方式如下:
类中的成员顺序是也无关紧要,且成员函 数可以访问定义在其后面的成员。
类可以嵌套定义。
5.2
类的成员可分为成员数据或成员函数。
类的数据成员在类体内定义,它的定义方 式和变量的定义方式相同。
必须注意,在定义类时,因此此时不能对 类中的成员数据初始化。
另外,类中的成员数据不能使用关键字 extern、auto以及register等(static除外) 来限定其存储类型。
5.3
swap函数值传递示意图:
a3
b5
x3
y5
(a)交换前
swa执p(行in函t,数int)a x
5
b3
3
y5
(b)交换后
5.3
2、引用传递
当函数的形参为引用类型时,调用该函数 的方式称为引用传递。引用传递的参数既可 以作为输入参数,也可以作为输出参数,即 当在函数中改变某个引用类型的形参时,其 对应的实参也作相应的改变。
为类体;类体后面必须以分号结束。
类体中定义的数据和函数称为该类的成员
,分为成员数据和成员函数两部分。
用关键字private限定的成员称为私有成员
,私有成员只限定在该类的内部使用;
用关键字public限定的成员称为公有成员,
公有成员可以被类中的成员函数和类外的函 数调用;
用关键字protected限定的成员称为保护成 员,对保护成员的访问要求与私有成员类似
// 函数体
其中,<类型>为函数返回值的类型,它可以是任 一标准数据类型或导出数据类型,当没有返回值时 ,《类型》必须为void。
<函数名>后的括号”( )”称为函数调用运算符, 对于无参函数,函数调用运算符内可以为空,也可 以为void。
5.3
2、有参函数
定义有参函数的一般格式为:
《类型》<函数名> (<形参表>) { …}
(2) 调用时是将实参的值传递给形参,此时只是
一种单向的传递关系。这是我们所说的“值传递”
,形参值的改变不会影响实参的。
(3) 实参与形参的类型应相同。当类型不一致时 ,则它们应该兼容。
5.3
三、函数参数的传递方式
1、值传递
值传递的特点是:在被调用函数的执行过 程中,当改变形参的值时,对应的实参的值 不会发生变化,即在函数体中不能改变实参 的值。在调用过程中,先求出实参表达式的 值,并将该值传递给相应的形参,函数对形 参的值作适当的处理,将处理结果通过函数 返回值(如果有的话)带给函数调用者,而不 能通过实参带回给调用者
5.2
类的成员函数与一般的函数类似,其函数 体可以在类体内定义也可以在类体外定义。
在类体内实现的成员函数都是内联函数,
称为内联成员函数,
在类体外实现的成员函数称为外联成员函 数,可以在函数实现时在其函数名前加上关
键字inline表示该函数是内联成员函数。
在类体外定义成员函数,一定要在成员函 数前加上“类名::” ,运算符“::”称为作用 域运算符或作用域限定符。
5.1
对象的状态是由其属性决定的,对象属性
的选取应该遵循的最基本的原则是:要能反 映对象的基本特征,它是对象真正需要记忆 的特征或数据。
从对象属性的不同来源可分为四类: (1)描述性属性 (2)定义性属性 (3)综合可得性属性 (4)偶尔可得性属性 从对象属性取值的特点上看,有三种类型 的属性:单值属性、多值属性和互斥属性。
5.2
关键字private、public、protected的作 用仅仅是限定成员的访问权限,在类体中的 顺序无关紧要,同一个关键字在类体中可以 被反复使用。其中private为类所默认的关键 字,即在类体中没有明确地指定成员的访问 权限时,系统约定这些成员为私有成员。
限定访问权限的关键字的限定范围为:从 该关键字后的第一个成员开始,到下一个限 定访问权限的关键字之间的所有的成员。