C语言实例教程(PDF格式)-第8部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
员函数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》y;
mypos。x=x;
mypos。y=y;
mypos。DisplayMyPosition(&mysrn);
}
请注意类MyPosition的DisplayMyPosition成员函数,它使用一个
指向MyScreen对象的指针作为参数。在DisplayMyPosition成员函
数的实现中,调用了MyScreen对象的PrintMyPosition成员函数,
PrintMyPosition成员函数需要一个指向MyPosition对象的指针作
为其参数,这里,我们希望将指向调用DisplayMyPosition成员函
数的对象本身的指针作为参数进行传递,这时就必须使用this指
针。将指向对象自身的指针作为参数传递给其它函数,在实际编
程中是一个很常用的技巧,在这些场合,this指针得到了广泛的
运用,在以后编程的过程中,我们会经常看到这样的用法。
除了示范this指针的用法以外,上面的代码还示范了如何在控制
台窗口中定位输出字符串的位置。运行上面的程序,它首先要求
用户输入一个坐标值,然后,在屏幕的最底行 (这里假定用户使用
80' 25的控制台窗口大小),最后,将下一次显示输出的位置定
位于用户所输入的坐标值所指定的点。整个程序运行的结果如图
所示。
…………………………………………………………Page 58……………………………………………………………
图2。3 在控制台窗口中进行定位
° 注意:
° 上面的程序代码不能在MS…DOS环境下进行编译和链接,因为
我们在程序中显式的调用了Win32控制台API函数 (如
SetConsoleCursorPosition和WriteConsoleOutputCharacter
等),它们属于Win32应用程序接口的一部分。为了使用这些
函数,我们在程序的最开始包含了头文件windows。h。因此,
上面的程序尽管具有和普通的MS…DOS环境下的C/C++程序代码
相一致的结构,但它是一个Windows应用程序,只能运行于32
位Windows环境。我们可以从上面的函数中看出Win32控制台
应用程序和传统的MS…DOS字符模式应用程序之间的本质 区
别。
2。2。3 静态成员
前面说过,无论是类中的成员变量还是成员函数,都可以声明为
静态的。类的静态成员在工作起来和非静态成员有很大的差别,
因此我们在这里用单独的一个小节来讲述它们。
先看一个静态数据成员的例子。
#include
class MyClass
{
…………………………………………………………Page 59……………………………………………………………
public:
static int i;
};
int MyClass::i;
void main()
{
MyClass cls1;
MyClass cls2;
cls1。i=1;
cout