一、c++类的设计
class 类型名称
{
public:
成员列表1;
protected:
成员列表2;
private:
};//最后分号不可少;注意:所有的说明都有分号
其中"class类名"称为类头(class lead)。花括号中的部分称为类体(class body) , 类体中定义
了类成员表(class member list)。
在C++中,类是一种数据类型。客观事物是复杂的,要描述它必须从多方面进行,也就是用不同的数据类型来描述不同的方面。如商场中的商品可以这样描述:
商品名称(用字符串描述), 该商品数量(用整型数描述),该商品单价(用浮点数描述),该商品总价(用浮点数描述)。
这里用了属于三种不同数据类型,四个数据成员(data member)来描述一种商品。在C++中可以这样表述:
成员数据
关键字class是数据类型说明符,指出下面说明的是类型。标识符CGoods是商品这个类的类型
名。花括号中是构成类体的一系列的成员,关键字public是一种访问限定符。访问限定符(access specifier)有3三种: public (公共的) ,private (私有的) 和protected (保护的)。
public说明的成员能从外部进行访问,private和protect说明的成员不能从外部进行访问。每种说明符可在类体中使用多次。它们的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。
如果在类体起始点无访问说明符,系统默认定义为私有( private )。访问说明符private (私有
的)和protected (保护的) 体现了类具有封装性( Encapsulation)。
成员函数
类型设计的更关键部分是对数据成员的操作,用函数来完成:
class CGoods
{
private:
char Name[21];
int Amount;
float Price;
float Total;
public:
void RegisterGoods(char[], int, float); //输入数据
void GetName(char[]); //读取商品名
void GetAmount(void); //读取商品数量
float GetPrice(void); //读取商品单价
void CountTotal(void); //计算商品总价值
};
这样在类中引|进了成员函数(member function)或函数成员,也就是函数也成了数据(类)中的一员。类把数据(事物的属性)和函数(事物的行为-操作)封装为一个整体。
四个数据成员被说明成私有,而五个函数成员被说明成公有;这就是说如果从外部对四个数据成员进行操作的话,只能通过五个公有函数来完成,数据受到了良好的保护,不易受外部环境的影响。公有函数集定义了类的接口(interface) 。
类是一种数据类型,定义时系统不为类分配存储空间,所以不能对类的数据成员初始化。类中的任何数据成员也不能使用关键字extern、auto或register限定其存储类型。
成员函数可以直接使用类定义中的任一成员, 可以处理数据成员,也可调用函数成员。成员函数的定义:
1、前面只对成员函数作了一个声明(函数的原型), 并没有对函数进行定义。
2、函数定义通常在类的说明之后进行,其格式如下:
回值类型类名::函数名(参数表)
{.....}//函数体
其中运算符"::"称为作用域解析运算符(scope resolution operator),它指出该函数是属于哪一个类的成员函数。
如下为一个商品类型的完整设计:
class CGoods
{
private:
char Name[21];
int Amount;
float Price;
float Total;
public:
void RegisterGoods(char[], int, float); //输入数据
void GetName(char[]); //读取商品名
int GetAmount(void); //读取商品数量
float GetPrice(void); //读取商品单价
void CountTotal(void); //计算商品总价值
float Gettotal(void)
{
return Total;
}
};
void CGoods::RegisterGoods(char name[], int amount, float price)
{
strcpy_s(Name,len, name);
Amount = amount;
Price = price;
}
void CGoods::CountTotal(void)
{
Total = Price * Amount;
}
void CGoods::GetName(char name[])
{
strcpy_s(Name, len, name);
}
int CGoods::GetAmount(void)
{
return (Amount);
}
float CGoods::GetPrice(void)
{
return (Price);
}
float CGoods::Gettotal(void)
{
return (Total);
}