版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章
类与对象
第五章类与对象
§5.1面向对象方法
§5.2类的定义
§5.3对象的创建
§5.4对象的初始化
§5.5特殊的类成员
§5.1面向对象方法
♦面向对象的基本思想
♦面向对象思想的由来与发展
.面向对象的基本4既念
◎
§5.1面向对象方法
面向对象的基本思想
■从现实世界中客观存在的事物(对象)出发
来构造系统
对象:对问题领域内人、物、事情等的抽象
■并在系统构造中运用人类的自然思维方式
(抽象、分类、组合、继承、封装)
§5.1面向对象方法
面向对象不仅是一些具体的软件开发
技术,它是一整套关于如何看待软件系
统与现实世界关系,以何种观点来研究
问题并进行求解,以及如何进行系统构
造的软件方法学
§5.1面向对象方法
♦用面向对象思想构造软件的主要内容
①对象是系统的基本单位
②对象的属性和操作的有机结合组成一个完
整的对象
③具有共同特征的对象抽象成类
④对类进一步抽象,形成类簇
⑤对象之间存在静态关系和动态关系(组合、
继承、消息等)
§5.1面向对象方法
面向对象基本思想——抽象
♦现实世界的事物抽象成对象
♦现实世界事物之间的关系抽象成软件系统中
对象之间的关系
♦具有共同特征的对象抽象成类
♦具有共同特征的类抽象成基类和派生类
§5.1面向对象方法
面向对象基本思想——封装
♦对象是属性和操作的组合
♦对象的表现(服务,接口)和实现细节分开
§5.1面向对象方法
♦面向对象方法的定义
利用抽象、封装等机制,借助于对
象、类、继承、消息传递等概念进行软
件系统构造的软件开发方法
§5.1面向对象方法
♦面向对象的由来与发展
面向对象方法起源于面向对象的编程语言
在编程语言得到充分发挥和应用的同时,面向
对象方法得到了发展。
反过来又为面向对象编程提供了先期的设计和
指导
§5.1面向对象方法
♦面向对象方法是软件理论的返璞归真
♦软件开发的发展过程
面向过程
程序员面向数据
的智慧
面向功能
和技巧面向对象
面向应用
面向数据流
§5.1面向对象方法
面向对象基本概念
♦对象
♦消息
♦类
♦类与对象的关系
§5.1面向对象方法
对象
♦对象是对问题域中客观存在的事物的抽象,它
是一组属性和在这些属性上的操作的封装体
♦对象的两大要素:属性和操作
-属性:状态,特征,组成成员
-操作:修改属性,访问属性,执行命令
§5.1面向对象方法
例:“文件”作为一个对象
属性:操作:
文件名一filename文件复制----copy
文件长度一length文件更名----rename
修改日期一modify-date文件打印----print
文件内容一contents
§5.1面向对象方法
消息
向对象发出的服务请求
■是面向对象系统中对象之间交互的途径
■要素:发送者、接受者、服务、参数
■oopl中的消息是对类的成员函数的调用
■对消息的响应取决于接受消息的对象
§5.1面向对象方法
类class
♦类是具有相同属性和操作的一组对象的集合,它为属
于该类的全部对象提供了统一的抽象描述
。类是对一类对象的抽象
。类定义了这一类对象所共有的特征和行为
人类抽象思维的产物
Ooopl中的类相当于一种数据类型
§5.1面向对象方法
类与对象的关系
♦类是抽象的,对象是具体的
♦类是模板,对象是实例
♦类是类型,对象是变量
♦类是静态的,对象是动态的
§5.1面向对象方法
♦类是具有相似特征的对象的抽象
-文件类所有具体文件对象的抽象
-书类所有具体书对象的抽象
-学生类所有具体学生对象的抽象
§5.2类的定义
•类定义的一般形式
•内联函数与非内联函数
•类成员的访问控制
•类作用域
§5.2类的定义
♦类定义的一般形式
class类名嘉合森
类定义
public:、体中的
公有数据和函数数据和
>函数分
别称为:
private:数据成
员和成
私有数据和函数员函数
分号不能丢!
§5.2类的定义
♦类定义体中包括两种类的成员:
数据成员和函数成员
♦通常类的定义格式:
class类名
(
public:
成员函数
private:
数据成员
};
§5.2类的定义
例:定义一个“文件”类
classFILE
public:
boolcopy(FILE&target);
操作
boolrename(char*new_name);>
成员函数
boolprint();,
private:
charfile_name[100];
属性
intlength;
数据成员
char.contents;
);
§5.2类的定义
♦操作的实现(成员函数的定义)
boolFILE::copy(.......)
}
boolFILE::rename(......)
}
boolFILE::print()
§5.2类的定义
♦注:
①类中说明的数据成员不能初始化
②类中数据成员的类型可以是int,char,
float等各种数据类型,还可以是对象
§5.2类的定义
♦内联函数与非内联函数
(1)内联函数
classFILE
(
boolrename(char*new_name)
{"
strcpy(filename,newname);
}一"
);
成员函数的函数体定义在类体内
§5.2类的定义
⑵非内联函数
classFILE
(
boolrename(char*new_name);
};
boolFILE::rename(char*newname)
(-
strcpy(file_name,new_name);
}~~
注:在类体外定义的成员函数要在函数名前加上类名,以便与普
通函数相区别
§5.2类的定义
⑶二者比较
内联函数的好处:
类的定义集中(将类的所有成员都放在类定义体中)
运行速度快
内联函数的缺点:
类定义的规模太大
可读性不好
通常,将简单的函数作为内联函数
将功能复杂的函数作为非内联函数
§5.2类的定义
♦类定义可分为类界面与类实现
类界面:只包括类的所有数据成员和成
员函数原型
存放在头文件中(.HPP)
类实现:包括类的所有成员函数的定义
存放在源文件中(.CPP)
§5.2类的定义
♦类的成员的访问控制(封装在类中的实现)
一公有(public)-公开
--保护(protected)■适当公开
"私有(private)“不公开
§5.2类的定义
♦封装(信息隐藏)
实现(implementation)
接口(interface)
§5.2类的定义
♦封装的好处
9用户角度:简单
只了解接口,不用了解细节
只需要结果,不规定实现方式
0对象角度:保护
信息安全(不直接访问数据)
安全审计(auditing)
§5.2类的定义
访问控制的基本原则:
♦类的数据成员一般不公开
"private,protected
♦表示接口的成员函数一般公开
—public
♦与实现细节有关的成员函数不公开
—private,protected
§5.2类的定义
注:
♦默认的类成员访问控制方式为private
♦各种访问控制方式在类定义体中的先后
顺序无关
♦通常将对外接口部分pub1ic放在前
举例:用“售报亭”对象描述现实中的一个售
报亨
报刊A
属报刊B
性
钱箱
月艮报刊零售
务货款清单
/
消息、:顾客对售报亭说:“买一份《每日新报》!"
消息的接受者:某个售报亭
要求的服务:报刊零售
输入的信息:要买的报刊种类,份数和递进去的钱
返回的信息:买到的报纸和找回的零钱
§5.2类的定义
类作用域
类的作用域包括:
类的定义体{);
类的所有非内联函数的定义体
类成员的作用域是类作用域
类对象的作用域遵循一般变量的作用域规则
§5.3对象的创建
♦直接创建对象
♦使用对象成员
♦对象的作用域与生存期
♦举例
§5.3对象的创建
♦创建对象有两种方式:
直接创建
动态创建(用new运算符创建)
嵩♦直接创建对象
格式:〈类名〉〈对象名表》
例如:FILEfl,f2;।>intx9y;
梦•一
殍卜
4§5.3对象的创建
使用对象成员
格式:
〈对象名〉•〈数据成员名〉
或〈对象名〉•〈函数成员名〉(参数表)
♦其中〈称为成员选择运算符
§5.3对象的创建
访问成员变量
strcpy(fl.filename,"oopd.daf5);
f2.1ength+=:10;
访问成员函数
fl.copy(f2);注:只有public的成员
才能调用或访问
fl.renameC'classA");
§5.3对象的创建
对象的作用域与生存期
♦遵循一般变量的作用域、生存期规则
.例:[兵局对象]
FILEmyfile;
voidmain()
(局部对象
1-----
FILEyourfile;、
myfile.copy(yourfile);
yourfile.renameCcnewname55);J
§5.3对象的创建
♦域操作符::
::identifier文件域标识符
②classname:identifier类域标识符
③identifier当前域标识符
boolFILE::rename(charfilename)
strcpy(FILE::filename,filename);
举例:定义一个日期类,该类的对象是某个具体日期
〃日期类的界面
classDATE
{
public:
voidsetdate(inty,intm,intd);
intisleapyear();
voidprint();
private:
intyear,month,day;
};
//以上存入date,hpp文件中
〃日期类的实现
#include''date.hpp”
voidDATE::setdate(inty,intm,intd)
(
year=y;
month=m;
day=d;
}
intDATE::isleapyear()
{
return(year%4=0&&year%100!=0)||(year%400==0);
}
voidDATE::print()
(
cout«year«',,«month«',,«day«endl;
}
〃以上存入date.cpp文件中
〃分析下列程序的输出结果
#include<iostream.h>
#include"date.cpp''
voidmain()
(
DATEdl,d2;
dl.setdate(199655,4);
d2.setdate(2004,l1,8);
intleapedl.isleapyear();程序执行结果:
cout«leap«endl;1
dl.print();1996,5,4
d2.print();2004,11,8
§5.4对象的初始化
.对象的初始化问题
.构造函数
.构造函数的含义及特点
.默认构造函数
.析构函数
同
§5.4对象的初始化
类对象成员不能在类定义时初始化
classFILE
(
public:
private:
intlength=O;
charfHe_name[]="testcpp'';
);
类是一种模板,类定义时并不分配内存
§5.4对象的初始化
另一种情况:
FILEmyfile;
myfile.filename[]="test.cpp'';
数据成员file_name是私有的,外界不能访问,
只能通过类中定义的成员函数来访问
§5.4对象的初始化
♦类成员的初始化在对象创建时进行
FILEmy_flle("test.cpp");
FILEyourfileC'noname.cpp59);
♦实现:构造函数
§5.4对象的初始化
构造函数与析构函数
在C++中,类的成员函数有两种:
(1)构造函数与析构函数
⑵普通的成员函数
构造函数与析构函数是在类定义体中说明的
两个特殊的成员函数
§5.4对象的初始化
classFILE
(
public:
FILE(charname[]);〃构造函数
private:
intlength;
charfile_name[100];
/
);
§5.4对象的初始化
♦构造函数的实现
FILE::FILE(charname[])
{
strcpy(file_name9name);
length=O;
§5.4对象的初始化
构造函数的调用时间
在对象建立时由系统自动调用
FILEmyfilef'myfile.cpp55);
FILE*pfile=newFILEf'yourfile.cpp55);
§5.4对象的初始化
构造函数的含义
直接含义:
对象建立时,初始化对象的数据成员
间接含义:
构造一个具有意义的、正确的对象
§5.4对象的初始化
构造函数的特点
♦是类的成员函数
♦函数名与类名相同(区别于其他成员函数)
♦无返回值,void也不能有(只进行初始化)
♦由系统自动调用(当对象被创建时)
♦必须是公有(public)成员(系统调用也遵守访问控制规则)
♦可以重载
♦可以初始化常量数据成员
§5.4对象的初始化
♦构造函数举例
#include<iostream.h>
classRECT
(
public:
RECT(int19intw);
voidarea();
private:
intlength,width;
);
RECT::RECT(int1,intw)
(
length=l;
width=w;
}
voidRECT::area()
(
cout«4tarea=,,«length*width«endl;
}
voidmain()
(
RECTa(5,8);
RECTb(9,4);
a.area();
b.area();
§5.4对象的初始化
程序执行结果:内存分配情况:
area=40
area=36
§5.4对象的初始化
♦构造函数的重载
classPOLYGON
(
public:
POLYGON();〃默认构造函数
POLYGON(intedgNum);
POLYGON(charcolor,intedgNum=3);
private:
intedgnum;〃边的个数
charlinecolor;〃线的颜色
POINTpoint[100];〃各顶点位置
);
§5.4对象的初始化
默认构造函数
POLYGON::POLYGON()
(
edg_num=3;
line_color=0;
fbr(inti=0;i<edg_num;i++)
point[i].x=point[i].y=0;
每个顶点坐标x,y位置初始值为0
§5.4对象的初始化
带参数的构造函数
POLYGON::POLYGON(intedgNum)
edg_num=edgNum;
line_color=0;
fbr(inti=0;i<edg_num;i++)
point[i].x=point[i].y=0;
§5.4对象的初始化
♦创建两个对象:(在主程序中)
POLYGONpgl;〃自动调用默认构造函数
POLYGONpg2(4);〃自动调用带参数构造函数
§5.4对象的初始化
默认构造函数
每个类必须有一个构造函数
如果没定义构造函数,则C++系统提供默认构造函数
(donothing)
如果定义了构造函数,则C++不再提供默认构造函数
如:POLYGONpgl;〃无初始化值的对象
必须要有一个默认的构造函数!
§5.4对象的初始化
析构函数
类的特殊的成员函数
构造函数
在类的对象创建时由系统自动调用的函数
析构函数
在类的对象生命期结束时由系统自动调用
的函数
§5.4对象的初始化
例:
#include<iostream.h>
classDEMO_CLASS
{
public:
DEMO_CLASS(inti);
^DEMO_CLASS();〃析构函数
);
DEMO_CLASS::DEMO_CLASS(inti)
(
cout«ctInitialvalueis:,,«i«endl;
return;
)
DEMOCLASS::〜DEMO_CLASS()
{——
cout«“Goodby!\n'';
return;
)
voidmain()
(
DEMO_CLASSobj(30);〃创建一个对象obj
cout«ctThisistheendofmain(
§5.4对象的初始化
♦程序执行结果:
Initialvalueis:30
Thisistheendofmain().
Goodby!
♦说明:
(1)对象obj的作用域及生命期在main()内,对象创建
时自动调用构造函数
(2)程序执行到main()的y处,贝》obj的生命期结束,
系统自动调用析构函数,并收回obj所占用的内存
空间
§5.4对象的初始化
析构函数的特点:
♦是类的成员函数
♦函数名为类名前加'〜'(逻辑反运算符)
♦无返回值,void也不能有
♦无参数
♦由系统自动调用(当对象生命期结束时)
♦必须是公有(public)成员(系统调用也遵守访问控
制规则)
♦不可以重载
§5.4对象的初始化
析构函数的意义
♦直接意义
-在对象退出生命期前由系统调用的函数
♦间接意义
-对象能正确、合理地退出生命期
♦如:释放占用资源,通知有关对象
§5.4对象的初始化
构造函数和析构函数
♦相同点
-由系统自动调用
-没有返回值
-公有函数
♦不同点
-作用不同,调用时间不同
-构造函数可以重载,可以有参数
§5.5特殊的类成员
♦常量成员
对象一旦定义,就不能更改该成员
♦静态成员
不属于对象的成员,由类的所有对象共享
♦对象成员
一个类的对象作为另一个类的数据成员
§5.5特殊的类成员
口常量成员
口静态成员
口对象成员
§5.5特殊的类成员
♦常量成员:对象一旦定义,就不能更改该成员
♦用const说明的成员,称为常量成员
♦常量成员的定义
常量数据成员的定义:constintedgnum;
常量成员函数的定义:voidprint()const;
§5.5特殊的类成员
常量数据成员只能初始化,不能被赋值
例:
classSILLY
public:
SILLY()
ten=10;常量不能赋值!
private:
constintten;
);
§5.5特殊的类成员
常量成员的初始化
classSILLY
public:
SILLY():ten(10)〃初始化常量数据成员
〃此处不能再对ten赋值
private:
constintten;
};
§5.5特殊的类成员
♦例:定义一个多边形的类
classPOLYGON
(
public:
private:
constintedgnum;〃边数确定的对象
charlinecolor;
);
注:常量成员不能作为左值
§5.5特殊的类成员
♦方法一
POLYGON::POLYGON():edg_num(3)
{
line_color=0;
for(……)
♦方法二
POLYGON::POLYGON(intedgNum):edgnum(edgNum)
{"
line_color=0;
for(……)
....;用构造函数的参数edgNum的
}值初始化常量成员edgnum
§5.5特殊的类成员
♦常量成员的使用注意:
⑴常量成员只能初始化,不能赋值
⑵常量成员的初始化必须在成员初始化参
数表中进行
§5.5特殊的类成员
非常量成员,也可在成员初始化参数表中进
行初始化
例:
POLYGON::POLYGON(charcolor,intedgNum)
:edgnum(edgNum),linecolor(color)
fbr(inti=0;........)
§5.5特殊的类成员
♦静态成员
-用static说明的成员
♦静态成员分为:
-静态数据成员
-静态函数成员
♦静态成员由类的所有对象共享
(不属于某个对象)
§5.5特殊的类成员
♦彳列:要记录FILE类中有多少个文件对象
classFILE
(
public:
staticintget_file_number()〃静态成员函数
{——
returnfilenumber;
}"
private:
staticintfilenumber;〃静态数据成员
};
§5.5特殊的类成员
♦理解静态成员
§5.5特殊的类成员
静态成员的使用
⑴静态成员的初始化必须在全局范围进行
intFILE::file_number=O;
classFILE
(
private:\/
staticintfilenumber=O;X
);A
voidmain()
intFILE::file_number=O;
§5.5特殊的类成员
⑵静态数据成员可以由所有成员函数访问
voidFILE::incFileNum()
(
file_number++;
}"
⑶静态成员函数只可以访问静态数据成员
staticintget_file_number()〃静态成员函数
cout«file_name;V//是对象的特征
returnfile_number;\/
§5.5特殊的类成员
静态成员的用途
记录对象个数(用来保存流动变化的对象个数)
一般在构造函数中增加,析构函数中递减
所有对象共享资源(它不属于某个对象)
如:内存,文件,数据库,打印机等
♦例:分析程序执行结果
#include<iostream.h>
classMYCLASS
public:
MYCLASS(inta,intb,intc);
voidget_number();
voidget_sum();
private:
intx,y,z;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自信自强主题班会
- 三年级上册生命与健康常识教案和生态文明美丽湖南教案
- 《SIS系统讲义》课件
- 计算机基础课教学反思
- 《律师办案艺术》课件
- 《完井工程基础》课件
- 《停车场(库)公共设施配建导则》编制说明
- 《定量构效关系》课件
- 《学习象形文字》课件
- 《快乐的节日教学》课件
- 公开课教案模板(理论课)
- 测井仪器设计规范--电子设计
- 《春》表格式教学设计完整优秀版
- 当前鸡鸭屠宰加工行业税收征管状况分析及对策
- 中西方绘画差异(课堂PPT)
- 《阜阳合肥现代产业园区总体规划(2017-2030)》简介
- GRG施工工艺及施工方案完整
- 二期混凝土施工方案
- 挖掘机专业词汇中日英文对照表
- (完整版)成本控制制度
- 热打码机常见故障检查方法
评论
0/150
提交评论