友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

C语言实例教程(PDF格式)-第7部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


              声明和定义时使用         class  struct  union  

              的关键字  



              默认的成员访问权         私有   公有      公有  

              限  



              使用限制             无     无       同时只能使用一 

                                            个成员  



由于联合的特殊性,我们将在后面的内容中讲述它。下面给出一个使 

用class来定义类的示例:  



class CCircle  



{  



public:  



unsigned Radius;  



CPoint Center;  



};  



下面我们使用关键字struct来定义类CPoint:  



struct CPoint  



{  



unsigned x;  



unsigned y;  



};  


…………………………………………………………Page 48……………………………………………………………

  l 注意:  



  l 请不要忘了在类定义的第二个大括号 “}”之后加上一个分号,否 

    则编译时会 出现一堆莫名其妙的错,并且没有一个错误会告诉你 

    是在定义类的时候少加了一个分号(也许它会告诉你别的什么地方 

    少了一个分号,但事实上那里什么错误也没有)。也许有人认为这 

    并非是一个值得强调的问题,然而事实上绝大多数初学者 (甚至包 

    括一些有经验的程序员)都会 由于疏忽大意而犯了这样的错误,并 

    且在修正它的时候花费了大量的时间却依然没有发现所有的问题 

    实际上只是由一个小分号造成的。  



细心的读者会注意到,在类CCircle的定义中我们使用了public关键 

字,而在类CPoint的定义中却没有使用。这是因为在使用struct定义 

的类中,成员的默认访问权限为公有,因此不需要使用public关键 

字,而对于使用class关键字来定义的类,由于其成员的默认访问权 

限为私有,因此必须使用关键字public来将成员Radius和Center的访 

问权限设置为公有。一般来说,一个类中总是包括了一定数量的公有 

成员,没有公有成员的类由于没有提供任何接口,事实上没有什么 

用。  



对于同一个类,可以使用关键字class来定义,也可以使用关键字 

struct来定义。对于上面的例子,我们将类CCircle改用关键字 

struct来定义,而将类CPoint改用关键字class来定义如下:  



struct CCircle  



{  



unsigned Radius;  



CPoint Center;  



};  



class CPoint  



{  



public:  



unsigned x;y;  



};  



现在我们来考虑一下,如果在同一个文件中定义类CCircle和类 


…………………………………………………………Page 49……………………………………………………………

CPoint,并采用如上面的代码,会遇到什么问题。我们看到,在类 

CCircle中定义了类CPoint的实例对象Center,然而,在定义实例对 

象Center的时候,我们还没有给出类CPoint的定义,这时,在编译时 

就会出现错误。因此,我们应该采用下面的顺序:  



struct CPoint  



{  



unsigned x;  



unsigned y;  



};  



class CCircle  



{  



public:  



unsigned Radius;  



CPoint Center;  



};  



以确保在使用类CPoint这前已经对它进行了定义。如果我们在类 

CPoint中添加一个成员函数IsInCircle来判断一个点是否在圆内,如 

下面的代码所示:  



struct CPoint  



{  



unsigned x;  



unsigned y;  



bool IsInCircle(CCircle *Circle)  



{  



return ( ((x…Circle…》Center。x)*(x…Circle…》Center。x)  



+(y…Circle…》Center。y)*(y…Circle…》Center。y))  



Radius*Circle…》Radius );  



}  


…………………………………………………………Page 50……………………………………………………………

};  



这真是一件很不幸的事情。为什么这样说呢?请看上面的代码,我们 

在IsInCircle成员函数中又使用到了类CCircle,而按照我们在前面 

所给出的代码,类CCircle是在类CPoint之后进行定义的,那么,将 

类CPoint放到类CCircle之后定义行不行呢?答案是不行的,不要忘 

了我们还在类CCircle中定义了一个类型为CPoint的数据成员 

Center。  



使用类的声明可以解决上面所遇到的两难问题。为了在定义类 

CCircle之前先引用类CCircle的类名,我们可以在类CPoint之前添加 

如下的代码:  



Class CCircle;  



  l 注意:  



  l 不能在末尾加上一对大括号,因为这样的话,上面的代码就会被 

   当作一个类的定义,这时,在同一文件作用域中就会出现了同一 

   类的两个定义,而这在C++中是不允许的,一个类可以有多个声 

   明,但是它只能有一个定义,对于函数也是这样。  



上面的代码和类的定义的差别在于它没有一对大括号 “{}”,这样, 

我们就可以在定义类CCircle先定义指向一个类CCircle的对象的指针 

和引用。但是,这时CPoint的代码不能像上面那样写,这是因为在成 

员函数IsInCircle中我们使用了类CCircle中定义的数据成员,而在 

此之前编译器只知道用以使用一个名为CCircle的类,但是不知道这 

个类中包括了什么样的成员,因此上面的代码在编译时通不过。  



如果解决所遇到的新问题呢?回过头来看类CPoint的定义,我们在定 

义类的同时定义了成员函数IsInCircle,联想到C语言中的函数,我 

们可以很自然的想到,可不可以选声明成员函数IsInCircle,然后再 

定义它呢?如果可以这样的话,我们就可以在类CPoint的定义中先声 

明成员函数IsInCircle,然后在定义了类CCircle之后再添加成员 

IsInCircle的定义。  



事实上我们正是基于这个想法来解决问题的。我们的确可以先在类 

CPoint的定义中声明成员函数IsInCircle,然后在后面添加它的定 

义,完整的代码如下:  



#include   



class CCircle;  


…………………………………………………………Page 51……………………………………………………………

struct CPoint  



{  



unsigned x;  



unsigned y;  



bool IsInCircle(CCircle *Circle);  



};  



class CCircle  



{  



public:  



unsigned Radius;  



CPoint Center;  



};  



bool CPoint::IsInCircle(CCircle *Circle)  



{  



return ( ((x…Circle…》Center。x)*(x…Circle…》Center。x)  



+(y…Circle…》Center。y)*(y…Circle…》Center。y))  



Radius*Circle…》Radius );  



}  



void main()  



{  



CPoint Center;  



CPoint Point;  



CCircle Circle;  



Center。x=0;  



Center。y=0;  



Point。x=2;  


…………………………………………………………Page 52……………………………………………………………

Point。y=3;  



Circle。Radius=3;  



Circle。Center=Center;  



if (Point。IsInCircle(&Circle))  



cout
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!