当前位置:编程学习 > C/C++ >>

如何学好C++中的类

答案:
14.2.3 C++中的类

面向对象程序设计中的类,最初应该来自分析模型或者设计模型,其中对于类所具有的属性和操作都进行了严格定义,几乎可以将这些设计得十分详细的、以图形方式描述的类直接转换成C++的类。本节介绍的是在语言中如何将类描述出来。
1. 类的说明
类描述了具有共同特征的一组对象,这组对象的属性和行为相同,只不过具体对象的属性值等有所区别。C++中类的定义一般分为类的说明部分和类的实现部分。其中类说明的格式如下:
class<ClassName>
{
private:
私有数据和函数
public:
受保护数据和函数
};
其中,class是关键字。<ClassName>是用户自定义的C++标识符,Visual C++中类名的风格是所有类的名字都以大写字母C开头,表示这是个类的名字,例如CBOOK,CStudent等。被花括号括起来的部分称作类体。注意,类说明是以分号作为结束的。
类体主要由一些变量和函数说明组成,分别称为类的数据成员和函数成员,统称为类成员。它们被分成3类,一类叫做公有成员,一类叫做私有成员,另一类叫做受保护成员,分别由关键字public,private和protected指明,这几个关键字被称为访问说明符(access specifier),用来控制相应成员在程序中的可访问性,使得信息封装和模块化的风格更好。访问说明符说明了对该说明符与下一个说明符之间出现的类成员的访问限制。类体中可以出现多个说明符,每个说明符也可出现多次,不同说明符的出现次序没有限制。当从类体开始处到某些类成员前没有访问说明符,或类体中根本没有访问说明符时,这些成员被默认是私有成员。
除了类的友元可以访问类的任何成员外,类的私有成员只能被其自身成员所访问。即私有成员的名字只能出现在所属类类体、成员函数中,不能出现在其他函数中;而对于一个类的公有成员而言,在程序的任何位置都能够以正确的方式引用它;类的保护成员只能在该类的派生类类体中使用。
[例14.1] 描述图14.6中所描述的图书类。
class CBook
{
private:
char * m_pczName;
int m_nPages;
int m_nEdition;
public:
void GetBookName(char *pName);
int GetTotalPages();
int GetBookEdition();
private:
void SetBookName(char * pName);
void SetTotalPages(int nPages);
void SetBookEdition(int nEdition);
public:
CBook();
};
CBook类中定义了私有和公有两类成员,其数据成员都为私有,这是出于封装的目的,不希望直接访问数据成员,而是通过所提供的公有函数访问,例如要知道书的名字可调用函数GetBookName(),要改变书的版本号要调用SetBookEdition()。
2. 类的定义
上述类说明声明了类的内部结构(数据成员)以及类的接口(成员函数的函数原型),但究竟这些函数的功能怎样实现并没有进行具体定义,因此要给出这一类对象的具体行为还应该对类的成员函数进行定义——类的实现。由于数据成员作为类体的部分已经在类说明中被说明和定义(对于常量对象),而类体的另一部分是成员函数,因此成员函数的定义有时也被称为类体的定义或类的定义。
1).成员函数的定义
成员函数的定义格式如下:
<ReturnType><ClassName>::<FunctionName>(<ArgumentList>)
{...}
与一般函数定义不同的是这里多出了类名<ClassName>和域运算符::用来指明所定义的函数属于哪个类,这是必需的,因为不同类中的成员函数可能重名,这种情况在客观世界中十分常见,不指定成员函数所属的类就无法知道要定义的是哪一个类的成员函数。花括号括起来的部分是函数体,它属于类体的一部分,其中可以直接调用类的所有成员,就如同它们是在函数体内定义的自动变量一样,包括数据成员和成员函数,而不用再显式地指明所属类体。注意,在函数中所调用的属性和其他成员函数为当前对象所具有的属性和成员函数。
[例14.3] 定义CBook类成员函数的实现。
Void CBook::GetBookName(char * pName)
{ strcpy(pName,m_pczName); }
int CBook::GetBookEdition()
{ return m_nEdition;}
void CBook::SetBookName(char * pName)
{
if(m_pczName!=0)
delet[ ] m_pczName; //如果已经有了旧名字,删除它,然后重新命名
m_pczName=new char[strlen(pName)+1];
//重新分配存储空间
strcpy(m_pczName,pName);
//复制字符串
}
void CBook::SetTotalPages(int nPages)
{ m_nPages=nPages; }
void CBook::SetBookEdition(int nEdition)
{ m_nEdition=nEdition; }
[例14.3] 定义CBook类成员函数的实现。
void CPoint::SetXY(int x,int y)
{
m_x=x;
m_y=y;
}
int CPoint::GetX()
{ return m_x; }
int CPoin:GetY()
{ return m_y; }
上述定义中,函数SetXY(int x,int y)是用所提供的函数参数x和y的值去设置CPoint类某个对象的m_x和m_y值。而其他两个函数的实现仅是将相应的坐标值返回。
通常将类的说明放在一个以.h为扩展名的文件中,称为头文件,其中定义了类的接口(ite易做图ce),可以同其他类的说明同放于一个文件。如果类说明的程序行较多应该将它放在一个独立文件中,Visual C++的风格是主文件名起名为类名去掉前面的字符C,例如CBook的类说明可以放在文件Book.h中,将类体的定义放于一个以.cpp为扩展名的文件中,称为类的实现文件,在这个文件的开始部分应用文件包含指令将类说明文件包含进来。这样做的目的主要是为了方便阅读,因为通常只要查看类的定义就可知道成员的调用格式。这里介绍的文件名只是一种编程风格,编程者可以遵循这种风格,也可以不这样做。
2.带缺省参数的成员函数
与普通函数一样,成员函数参数可以被指定缺省值,当调用该成员函数时,如果没
有显式指明参数,则按照相应的语法规则用参数缺省值作为参数调用该成员函数。
说明成员函数参数缺省值是在类声明中的函数原型中进行的,其格式和规则与一
般函数参数缺省值的说明类似。例如:
class CPoint
{
...
void SetXY(int x=0,int y=0);
...
};
3.重载成员函数
成员函数可以重载,方式与一般函数的重载类似,在类声明中首先声明重载函数的原型,在类体定义时分别对所声明的每个重载函数进行定义,例如:
class CPoint
{
...
void SetXY(int x,int y);
void SetXY(int x);
void SetXY(int y);
...
}
void CPoint::SetXY(int x, int y)
{
m_x=x;
m_y=y;
}
void SetXY(int x);
{ m_x=x;}
首先要明白什么是面向对象。类是属性和操作的集合,看到本质后,然后通过实例的分析来加深类的印象好概念。就可以了。当然类的其他附属的知识及语法是需要理解的。

上一个:电话簿管理程序设计(一定用c++)
下一个:在C++中如何实现文件的读写?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,