第四章 类与对象的构造设计
类的构造是面向对象程序设计的支柱,是C++实现数据隐蔽和封装的基本单元,是实现其他许多高级特性的基础。
本章讨论类和对象的定义、设计和实现方法。
本章的目的:
.掌握类的说明和对象创建方法
.掌握控制对象类的成员访问权限方法
.了解构造函数和析构函数的用法
.学习类的封装、可见性和引用操作方法
.了解结构、联合的面向对象特性和用法
4.1 类的构造和创建
在通往面向对象的道路上共有7个台阶:
①、基于对象的模块结构。系统基于数据结构进行模块化,而不是基于功能模块化。
②、数据抽象。对象应该是抽象数据类型的实现。
③、自动存储管理。失效的对象应该在没有程序员的干预下,被底层程序语言系统收回。
④、类的形成每个非常简单的类型都是一个模块,而每个高层次的模块都是一个类型。一个综合了模块和类型的特性的程序语言单位被称为类(class)。
⑤、继承性。一个类应该能被定义为另一个类的扩允或约束。
⑥、多态性和动态联编。一个程序实体应该能指向多个类的对象,同一种操作在不同的类中应该有不同的实现。
⑦、多重继承和重复继承。见图4.1所示。一个类可以是多个类的了类,可以多次成为同一个类的子类。
可以说,具有对象概念的程序设计语言分为三类:
基于对象的语言——仅有对象的概念,但没有将对象的共性抽象化,形成类,这就大大限制了软件模块化。
基于类的语言——类的引进不仅符合问题域的自然求解要求,而且把模块和类型的特性综合在一起,体现了软件设计的优良标准。
面向对象的语言——继承性提供了描述类层次关系的机制,同时对软件的可复用性提供了充分支持,与之相联系的类层次的多态性和动态联编则对软件的可扩允性提供了支持。
类与继承是面向对象语言最根本的特征,是面向对象的标志。
在C++中,存在三种类型说明:类、结构、联合,相应地使用的关键词是class、struct、union。
4.1.1 类设计的基本概念类的说明是一个逻辑抽象的概念,它声明了一种新的“数据类型”,描述了一类对象的共同特性,它把属性数据及其操作方法能够包容在一起。
类本身具有自含性。类中成员按其使用或存取的方式分类,分别使用关键词private、public和protected,为具体实现封装和继承机制提供条件。类的public部分定义的成员变量和成员函数可以被类外代码访问,是类对象的外部接口。
对象是按类来定义的,对象的生成才真正创建了这种数据类型的物理实体。即对象占用实际的内存空间,而类的说明不占用内存。
4.1.2 类的说明与对象定义说明类的语法与说明结构有些相似,但要使用关键字class。说明类的一般形式如下:
class calss_name{
private://私有成员,默认值
private function and variable;
protected://保护成员
protected function and variable;
public://公有成员
public function and variable;
}object_list;
其中class_name是类名,也是一种新的类型名;object_list为可选项,用户可在说明类之后,根据需要说明类的对象。
类说明体内的变量和函数统称为这个类的成员,通过访问权限词(后面加冒号)说明其不同的使用方式。利用这些关键字与成员函数,可以达到数据封装或提供对外接口的功能。
创建一个具体对象有两种方法:
(1)、在类说明时使用object_list选项。这里的对象是全局对象。
(2)、在使用时定义对象和定义格式与一般变量的定义相同,例如:
class_name object_list;
注意:该语句建立的对象的可见性(作用域)决定于它所存的位置。若该语句在函数内,则是局部对象。
[例4.1] 类的说明与对象定义实例。(EX4_1.CPP)
4.1.3 成员函数的功能与定义方式成员函数的功能和作用是表达对象内部的自维护和调节机制,提供对象与外界程序的界面,实现对象操作的行为计算程序表达。
从上例中可以看到,在类的说明体内,成员函数只做了声明,而在类外才定义了该函数,这属于外置定义方式。对此种方式,使用时应注意:
(1)、在函数名前标明类属,形式是
return_type class_name::function_name(para_list)
(2)、函数返回类型与类说明中的类型一致。
(3)、显式指明函数参数的类型和名字。
在类的说明体内定义的成员函数称为内部函数或内置函数。其定义方式包括有嵌入式(嵌在类说明体内的)和内联式。内联函数的定义方法是在函数名前加关键字inline,而且函数是放在类说明体之外定义,即相当于在外置函数前加上inline关键字。
一般的做法是对于比较小的成员函数,在类说明体内部定义,有助于减少开销,提高速度;而对比较大的成员函数,则在类体外定义,这样可以减少程序代码的长度。
4.1.4 对类成员的访问类成员访问的原则是:
(1)、成员函数可直接访问同类中的成员变量和调用同类中的成员函数,不用在函数名前加上对象名。这里,有类作用域的概念存在。通常,公用成员的类作用域是不但包括类说明体,还包括它所属的对象的可视范围(静态成员除外);私有成员或受保护成员的作用域仅限于类的说明体和类的成员函数。
(2)、类外访问时,必须在成员名前加上对象名。因为每个对象都有自己成员的备分,成员只能存在于对象中,不能独立于对象给变量同值。
对于类中成员访问,使用成员选择算符(.)和指向符(->)将对象名与成员名联系起来表示。
(3)、使用关键字说明的成员访问权限,见表4.1
表4.1 成员访问权限所使用的关键字
访问权限
Public
可以为类的成员函数、友元函数和外部的所有函数访问
Protected
只能为类的成员函数和友元函数所访问
private
只能为类的成员函数和友元函数所访问
类的构造是面向对象程序设计的支柱,是C++实现数据隐蔽和封装的基本单元,是实现其他许多高级特性的基础。
本章讨论类和对象的定义、设计和实现方法。
本章的目的:
.掌握类的说明和对象创建方法
.掌握控制对象类的成员访问权限方法
.了解构造函数和析构函数的用法
.学习类的封装、可见性和引用操作方法
.了解结构、联合的面向对象特性和用法
4.1 类的构造和创建
在通往面向对象的道路上共有7个台阶:
①、基于对象的模块结构。系统基于数据结构进行模块化,而不是基于功能模块化。
②、数据抽象。对象应该是抽象数据类型的实现。
③、自动存储管理。失效的对象应该在没有程序员的干预下,被底层程序语言系统收回。
④、类的形成每个非常简单的类型都是一个模块,而每个高层次的模块都是一个类型。一个综合了模块和类型的特性的程序语言单位被称为类(class)。
⑤、继承性。一个类应该能被定义为另一个类的扩允或约束。
⑥、多态性和动态联编。一个程序实体应该能指向多个类的对象,同一种操作在不同的类中应该有不同的实现。
⑦、多重继承和重复继承。见图4.1所示。一个类可以是多个类的了类,可以多次成为同一个类的子类。
可以说,具有对象概念的程序设计语言分为三类:
基于对象的语言——仅有对象的概念,但没有将对象的共性抽象化,形成类,这就大大限制了软件模块化。
基于类的语言——类的引进不仅符合问题域的自然求解要求,而且把模块和类型的特性综合在一起,体现了软件设计的优良标准。
面向对象的语言——继承性提供了描述类层次关系的机制,同时对软件的可复用性提供了充分支持,与之相联系的类层次的多态性和动态联编则对软件的可扩允性提供了支持。
类与继承是面向对象语言最根本的特征,是面向对象的标志。
在C++中,存在三种类型说明:类、结构、联合,相应地使用的关键词是class、struct、union。
4.1.1 类设计的基本概念类的说明是一个逻辑抽象的概念,它声明了一种新的“数据类型”,描述了一类对象的共同特性,它把属性数据及其操作方法能够包容在一起。
类本身具有自含性。类中成员按其使用或存取的方式分类,分别使用关键词private、public和protected,为具体实现封装和继承机制提供条件。类的public部分定义的成员变量和成员函数可以被类外代码访问,是类对象的外部接口。
对象是按类来定义的,对象的生成才真正创建了这种数据类型的物理实体。即对象占用实际的内存空间,而类的说明不占用内存。
4.1.2 类的说明与对象定义说明类的语法与说明结构有些相似,但要使用关键字class。说明类的一般形式如下:
class calss_name{
private://私有成员,默认值
private function and variable;
protected://保护成员
protected function and variable;
public://公有成员
public function and variable;
}object_list;
其中class_name是类名,也是一种新的类型名;object_list为可选项,用户可在说明类之后,根据需要说明类的对象。
类说明体内的变量和函数统称为这个类的成员,通过访问权限词(后面加冒号)说明其不同的使用方式。利用这些关键字与成员函数,可以达到数据封装或提供对外接口的功能。
创建一个具体对象有两种方法:
(1)、在类说明时使用object_list选项。这里的对象是全局对象。
(2)、在使用时定义对象和定义格式与一般变量的定义相同,例如:
class_name object_list;
注意:该语句建立的对象的可见性(作用域)决定于它所存的位置。若该语句在函数内,则是局部对象。
[例4.1] 类的说明与对象定义实例。(EX4_1.CPP)
4.1.3 成员函数的功能与定义方式成员函数的功能和作用是表达对象内部的自维护和调节机制,提供对象与外界程序的界面,实现对象操作的行为计算程序表达。
从上例中可以看到,在类的说明体内,成员函数只做了声明,而在类外才定义了该函数,这属于外置定义方式。对此种方式,使用时应注意:
(1)、在函数名前标明类属,形式是
return_type class_name::function_name(para_list)
(2)、函数返回类型与类说明中的类型一致。
(3)、显式指明函数参数的类型和名字。
在类的说明体内定义的成员函数称为内部函数或内置函数。其定义方式包括有嵌入式(嵌在类说明体内的)和内联式。内联函数的定义方法是在函数名前加关键字inline,而且函数是放在类说明体之外定义,即相当于在外置函数前加上inline关键字。
一般的做法是对于比较小的成员函数,在类说明体内部定义,有助于减少开销,提高速度;而对比较大的成员函数,则在类体外定义,这样可以减少程序代码的长度。
4.1.4 对类成员的访问类成员访问的原则是:
(1)、成员函数可直接访问同类中的成员变量和调用同类中的成员函数,不用在函数名前加上对象名。这里,有类作用域的概念存在。通常,公用成员的类作用域是不但包括类说明体,还包括它所属的对象的可视范围(静态成员除外);私有成员或受保护成员的作用域仅限于类的说明体和类的成员函数。
(2)、类外访问时,必须在成员名前加上对象名。因为每个对象都有自己成员的备分,成员只能存在于对象中,不能独立于对象给变量同值。
对于类中成员访问,使用成员选择算符(.)和指向符(->)将对象名与成员名联系起来表示。
(3)、使用关键字说明的成员访问权限,见表4.1
表4.1 成员访问权限所使用的关键字
访问权限
Public
可以为类的成员函数、友元函数和外部的所有函数访问
Protected
只能为类的成员函数和友元函数所访问
private
只能为类的成员函数和友元函数所访问