第九章类与对象
面向对象程序设计的基本特点
- 以数据为中心,采用对象来描述内部属性和操作方法
- 将数据和函数当作一个统一体,采用软件对象模拟客观世界中实际对象
- 特征:抽象、封装、继承和多态性
- 抽象是对具体对象进行概括,抽出这一类对象的公共性质并加以描述的过程
- 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)
- 行为抽象:描述某类对象的共有的行为特征或具有的功能
- 抽象的实现:通过类的声明
封装
- 将抽象出的数据和行为相结合,将它们视为一个整体,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员
- 实现封装:类声明中的{}
继承
多态性
- 多态:相同的语法结构(数据或操作)代表多种功能
- 目的:达到行为标识统一,减少程序中标识符的个数
- 实现:函数重载、运算符重载和虚函数
类概念和声明
类:具有相同类型数据和行为的对象集合
- 将数据和函数当作一个统一体–类
- 类是对客观世界万物的抽象描述
- 结构体是复合数据的统一体
实体:指客观世界存在的某个事物
怎样描述实体:
- 程序中通过对实体进行抽象来描述实体
- 每个实体都有其特征和功能,特征(数据)和功能(行为)通称为属性
- 实体与实体的不同在于属性的不同
- 所谓抽象描述实体就是:从实体中抽取出若干数据和行为,来表示实体。数据指实体的静态属性,行为指实体的动态属性
类是一种用户自定义类型,声明形式:
公有类型成员
- 关键词public
- 外界能够直接访问该成员:
- 一般函数成员被定义为公有成员
- 通过调用共有函数成员实施规定的操作
- 外界与类之间起着接口的作用
私有类型成员
- 关键字private(类起始处默认为private)
- 外界(类外)不能够直接访问该成员
- 一般数据成员被定义为私有成员
- 使得成员被封装隐藏起来,外界不能随便修改对象的私有数据成员
- 只有通过类中公有函数对数据进行修改,达到数据的安全性
- 允许本类中的函数访问
保护类型
- 关键字protected
- 外界部分区域能够访问该成员:
- 数据或函数成员在类外被有限制的访问
- 私有是对外界完全封闭,公有是完全开放,保护是介于两者之间
- 允许本类中的函数访问
- 与private类似,其差别表现在继承与派生时对派生类的影响不同
成员数据
- 与一般的变量声明相同,但需要将它放在类的声明体中
- 指明访问控制属性
成员函数
- 在类中说明原型,可以在类外或类内给出函数体实现
- 在类中给出函数体,则形成内联成员函数
- 类外实现时须在函数名前使用类名加以限定
- 成员函数在类外定义时,必须在函数名前面加上类名+"::",予以限定,"::"是作用域限定符
- 允许声明重载函数和带默认形参值的函数
- 加了类作用域后,类中的成员可以直接引用
内联成员函数
- 为了提高运行时的效率,对于较简单的函数可以声明为内联形式
- 内联函数体中不要有复杂结构(如循环语句和switch语句)
- 在类中声明内联成员函数的方式:
- 隐式:将函数体放在类的声明中
- 显示:使用inline关键字
对象:是类的一个实例或个体或元素
什么是对象
- 对象指被对象描述的某个实体
- 一个对象包含了实体的数据和行为
- 对象=实体的数据+实体的行为
- 对象=数据+函数
- 将数据和函数当作一个统一体
- 类的对象是该类的某一特定实体,即类类型的变量
- 类相当于类型,对象相当于该类的变量
- 声明形式: 类名 对象名;
- 对象所占内存只用于存放数据成员,函数成员占用公共空间。
类中成员的访问方式
- 对象的引用类似于结构体
- 类中成员互访:直接使用成员名
- 类外访问:使用"对象名.成员名"方式访问public属性的成员 eg: myClock.showTime();
- 可以对对象直接进行赋值: myClock = yourClock
引用对象应该注意:
- 成员函数可直接访问同类中的数据成员
- 对象访问其数据成员或成员函数需使用运算符
- 禁止类外直接访问一个对象中的私有成员
- 同类对象之间可以整体赋值
- 对象用作函数的参数时属于赋值调用
- 对象可以用作函数值类型,函数可以返回一个对象
构造函数
- 构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态
- 在对象创建时由系统自动调用
- 如果程序中未声明,则系统自动产生出一个默认形式的构造函数
- 允许为内联函数、重载函数、带默认形参值的函数
-
析构函数
类的组合
- 类中的成员数据是另一个类的对象