第5章
类 和 对 象
封装性(Encapsulation)是面向对象程序设计的重要特性之一,主要通过类和对象体现。类是C++语言的核心概念,其本质是一种数据类型;而对象是某一种类的实例,因此类和对象密切相关。通过类的封装性,可以实现数据的隐藏性,便于程序的维护和修改。本章主要介绍类的定义以及类和对象的应用。
学习目标:
(1) 掌握类和对象的定义,掌握对象的初始化方法,了解成员函数的特性;
(2) 掌握静态成员的概念和使用方法,了解常类型的概念和使用方法;
(3) 掌握对象指针、对象引用以及对象数组的使用方法,了解子对象和堆对象的基本概念;
(4) 掌握友元函数和友元类的概念和使用方法;
(5) 了解类的作用域和对象的生存期的概念。
5.1类的定义
类是一种用户自定义的数据类型,是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的数据成员,共同行为被描述为类中的成员函数。
5.1.1类的定义格式
类的定义格式一般分为声明和实现两部分。声明部分用来声明类中的成员,包括数据成员和成员函数的声明,其中数据成员又称为属性,成员函数又称为方法或操作,用来对数据进行操作。数据成员的声明包含数据成员的名字和类型;成员函数可以在类体内定义,也可以在类体内只对其进行声明,而在类体外实现部分进行定义。如果一个类中所有的成员函数都是在类体内定义,则该类就没有类外实现部分。在类体内定义的成员函数为内联函数。具体定义格式如下: class<类名>//声明部分
{
public:
<公有数据成员和成员函数的声明或实现>
protected:
<保护数据成员和成员函数的声明或实现>
private:
<私有数据成员和成员函数的声明或实现>
};
<函数类型><类名>::<成员函数名>(<参数表>)//实现部分
{
<函数体>
}
其中,class为关键字;<类名>为标识符;花括号内是类的声明部分,对该类的成员进行声明。类成员包含数据成员和函数成员,数据成员通常是变量或对象的声明语句,而函数成员指函数的定义或函数声明语句。
〖1〗C++程序设计基础教程〖1〗第5章类和对象public: 关键字,说明其后的成员为公有成员。通常将类的成员函数全部或部分定义为公有成员。
private: 关键字,可默认,说明其后的成员为私有成员。通常将类的数据成员定义为私有成员,是被隐藏的部分。
protected: 关键字,说明其后的成员为保护成员。
关键字public、private和protected称为访问权限控制符或访问权限修饰符,它们在类体中出现的顺序和次数没有限制,用来说明类成员的访问权限。
【例5.1】定义一个水果类。class Fruit
{
public://声明公有的成员函数
void SetFruitNumber(int num){fruitNumber=num;}
void SetFruitName(string name){fruitName=name;}
void SetPurchasePrice(double price){purchasePrice=price;}
int GetFruitNumber(){return fruitNumber;}
string GetFruitName(){return fruitName;}
double GetPrice(){return purchasePrice;}
void DispFruitName(){cout<<"水果名称:"<
void DispPurchasePrice(){cout<<"进价为:"<
void DispFruitNumber(){cout<<"水果编号"<
void DispFruit();
private://声明私有的数据成员
int fruitNumber;
string fruitName;
double purchasePrice;
};
void Fruit::DispFruit()
{
cout<<"水果编号:"<
}
该类有13个成员,包括3个私有的数据成员和10个公有的成员函数。其中成员函数DispFruit()在类体内声明,在类体外定义,用于显示数据成员的值;而其他几个成员函数的定义都在类体内给出,用于给数据成员赋值、获取数据成员的值并分别显示数据成员的值。3个数据成员分别表示水果的编号、名称和进货价格。
【例5.2】定义一个类,描述平面上的一个点。class Point
{
public://声明公有的成员函数
void SetValue(int x,int y);
int GetX(){return X;}
int GetY(){return Y;}
void Move(int x,int y);
private://声明私有的数据成员X和Y
int X,Y;
};
void Point::SetValue(int x,int y)//成员函数SetValue()在类体外的实现
{
X=x;Y=y;
}
void Point::Move(int x,int y)//成员函数Move()在类体外的实现
{
X+=x;Y+=y;
}
该类的两个数据成员X和Y是私有成员,分别表示平面上点的横坐标和纵坐标;该类定义了4个公有的成员函数,其中SetValue()用于给数据成员X和Y赋值,GetX()和GetY()用于返回数据成员X和Y的值,Move()用来改变点的坐标值X和Y。
成员函数的定义既可以在类体内,也可以在类体外的实现部分。在类体外定义时,必须使用“::”符号说明该函数属于哪个类,该符号称为作用域运算符。如上例中的SetValue()和Move()两个成员函数在类体外的定义。
定义类时需要注意以下几点: