文档介绍:第五章类与对象
通过前几章的学习,我们初步了解了面向过程的程序设计方法。学习了什么是数据,怎样定义数据和怎样按一定的算法编写函数来对数据进行操作,怎样用结构化程序设计的思想来编写程序。这为学习面向对象的程序设计打下了基础,因为C++不是纯面向对象程序设计的语言,这一点尤其重要。从本章起将进入面向对象程序设计学习的实质阶段。
封装(Encapsulation)是面向对象程序设计最基本的特性,把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。本章将引入C++的类(class)和对象(object)的概念,建立“函数也可以是数据类型的成员”的思想。本章中用运算符的重载来体现类和对象封装的实用性和重要性。
学习程序设计(编制软件)的目的是要解决实际问题,只有具备了从实际问题中抽象出类和对象的能力,才能说初步掌握了面向对象的程序设计的方法。从本章开始逐步培养从实际问题抽象出类和对象来的能力。
类与对象
本小节引入类与对象的最基本的概念:类的定义、对象的创建与使用。
C++类的定义
在C++中,类是一种数据类型。在前面几章中讨论了基本数据类型,数组和枚举类型。后两者是导出的数据类型,是由用户自己定义,自己按规则构造出来的,但其基本组成单位(数据成员)都是同一种数据类型。然而客观事物是复杂的,要描述它必须从多方面进行,也就是用不同的数据类型来描述不同的方面。如商场中的商品可以这样描述:
商品名称(用字符串描述),该商品数量(用整型数描述),该商品单价(用浮点数描述),该商品总价(用浮点数描述)。
这里用了属于三种不同数据类型的四个数据成员(data member)来描述一种商品。在C++中可以这样表述:
class CGoods{
public :
char Name[21] ; //对于中文可用wchar_t name[11]
int Amount ;
float Price ;
float Total_value ;
} ; //最后的分号不可少
上面的表述中,关键字class是数据类型说明符,指出下面说明的是类。标识符CGoods是商品这个类的类型名。花括号中是构成类体的一系列的成员,关键字public是一种访问限定符,表示其后所列为公共成员,就是说可以在外部对这些成员进行访问。如没有该访问说明符,这些成员是不能在类的外部对它进行访问的。访问限定符(
access specifier)有三种:public(公共的),private(私有的)和protected(保护的),由后两种说明的成员是不能从外部对它进行访问的。这三种说明符的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。每种说明符可以在类体中使用多次,当然要做合理安排。如果在类体起始点没有访问说明符,则系统默认定义为私有(private)。访问说明符private(私有的)和protected(保护的)体现了类具有封装性(Encapsulation)。
定义一个类的一般格式为:
class 类名{
《《private:》
成员表1;》
《public:
成员表2;》
《protected:
成员表3;》
};
其中“class 类名”称为类头(class head)。花括号中的部分称为类体(class body),类体中定义了类成员表(class member list)。
但上面的定义还没有包括类定义的更关键部分:对数据成员的操作。下面给出有关商品类的定义还应该增加的操作部分:首先要求能够输入商品的名称、数量和单价,然后要求算出总价值,最后还要求能够取得有关数据。这可以用六个函数来完成:
void RegisterGoods(char* , int , float) ; //输入数据
void CountTotal(void) ; //计算商品总价值
void GetName(char*) ; //读取商品名
int GetAmount(void) ; //读取商品数量
float GetPrice(void) ; //读取商品单价
float GetTotal_value(void) ; //读取商品总价值
这就是对数据的操作,可以把它们与数据封装在一起,这样得到新的商品类:
class CGoods{
private :
char Name[21] ;
int Amount ;
float Price ;
float Total_value ;
public :
void RegisterGoods(char*,int,float) ;
void CountTotal(void)