友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
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
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!