📄 chap02.html
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>Class CCircle;</P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>不能在末尾加上一对大括号,因为这样的话,上面的代码就会被当作一个类的定义,这时,在同一文件作用域中就会出现了同一类的两个定义,而这在</FONT><FONT SIZE=3>C++</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中是不允许的,一个类可以有多个声明,但是它只能有一个定义,对于函数也是这样。</LI></P></UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">上面的代码和类的定义的差别在于它没有一对大括号“{}”,这样,我们就可以在定义类</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>先定义指向一个类</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的对象的指针和引用。但是,这时</FONT><FONT SIZE=3>CPoint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的代码不能像上面那样写,这是因为在成员函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中我们使用了类</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中定义的数据成员,而在此之前编译器只知道用以使用一个名为</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的类,但是不知道这个类中包括了什么样的成员,因此上面的代码在编译时通不过。</P>
<P ALIGN="JUSTIFY">如果解决所遇到的新问题呢?回过头来看类</FONT><FONT SIZE=3>CPoint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义,我们在定义类的同时定义了成员函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,联想到</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言中的函数,我们可以很自然的想到,可不可以选声明成员函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,然后再定义它呢?如果可以这样的话,我们就可以在类</FONT><FONT SIZE=3>CPoint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义中先声明成员函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,然后在定义了类</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之后再添加成员</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义。</P>
<P ALIGN="JUSTIFY">事实上我们正是基于这个想法来解决问题的。我们的确可以先在类</FONT><FONT SIZE=3>CPoint</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义中声明成员函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,然后在后面添加它的定义,完整的代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>#include <iostream.h></P>
<P>class CCircle;</P>
<P>struct CPoint</P>
<P>{</P>
<P>	unsigned x;</P>
<P>	unsigned y;</P>
<P>	bool IsInCircle(CCircle *Circle);</P>
<P>};</P>
<P>class CCircle</P>
<P>{</P>
<P>public:</P>
<P>	unsigned Radius;</P>
<P>	CPoint Center;</P>
<P>};</P>
<P>bool CPoint::IsInCircle(CCircle *Circle)</P>
<P>{</P>
<P>	return ( ((x-Circle->Center.x)*(x-Circle->Center.x)</P>
<P>	 +(y-Circle->Center.y)*(y-Circle->Center.y))</P>
<P>	 <=Circle->Radius*Circle->Radius );</P>
<P>}</P>
<P>void main()</P>
<P>{</P>
<P>	CPoint Center;</P>
<P>	CPoint Point;</P>
<P>	CCircle Circle;</P>
<P>	Center.x=0;</P>
<P>	Center.y=0;</P>
<P>	Point.x=2;</P>
<P>	Point.y=3;</P>
<P>	Circle.Radius=3;</P>
<P>	Circle.Center=Center;</P>
<P>	if (Point.IsInCircle(&Circle))</P>
<P>		cout<<"The poi</FONT><FONT FACE="隶书" LANG="ZH-CN" SIZE=1>nt is in </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>the circle."<<endl;</P>
<P>	else</P>
<P>		cout<<"The Point is not in the circle."<<endl;</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">我们先看一下函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义和一般的函数的定义有什么不同。我们看到,在函数名</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>前使用了作用域限定符“</FONT><FONT SIZE=3>::</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>”,即出现在函数定义处的完整的函数名为</FONT><FONT SIZE=3>CCircle::IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,这说明了函数</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是类</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的一个成员。如果仅使用函数名</FONT><FONT SIZE=3>IsInCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,则编译器不会把它当作类</FONT><FONT SIZE=3>CCircle</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员,而是将它当作一个具有文件作用域的全局函数。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">同在类定义内部定义的成员函数一样,在函数外定义的成员函数一样可以直接的访问类中的数据成员和调用其它的成员函数,而无论它们本身是私有的还是公有的。但是,在类定义内部定义的成员函数和在类定义外部定义的成员函数还是有差别的。对于在类定义内部定义的成员函数,编译器总是将它作为一个内联函数来进行编译,无论你是否使用了</FONT><FONT SIZE=3>inline</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字。而对于在类定义外部定义的成员函数,除非你显式使用了</FONT><FONT SIZE=3>inline</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字,编译不会将它作为一个内联函数来编译。但如果加上了</FONT><FONT SIZE=3>inline</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字,则编译器以同样的方式对待在类定义外部定义的成员函数。一般来说,对于比较短少的成员函数,在可能情况下,我们大多在类定义内部定义它们,而对于代码量比较大的成员函数,则几乎都是在类定义的外部来定义它们,否则,代码的可读性会变得很糟糕。</P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>请仔细分析下面的代码:</LI></P>
</FONT><FONT FACE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -