运算符重载Word文档格式.docx
- 文档编号:20803685
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:11
- 大小:19.32KB
运算符重载Word文档格式.docx
《运算符重载Word文档格式.docx》由会员分享,可在线阅读,更多相关《运算符重载Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
假设在类定义内重载>
运算符的函数是CBox类的成员,则该函数的声明如下所示:
class
CBox
{
public:
bool
operator>
(CBox&
aBox)
const;
//
Overloaded
'
greater
than'
Rest
of
the
definition...
};
这里的单词operator是个关键字。
该关键字结合运算符符号或名称,本例中是>
,将定义一个运算符函数。
本例中的函数名是operator>
()。
在运算符函数的声明中,关键字和运算符本身之间有无空格都行,前提是没有歧义。
歧义出现在运算符是名称而非符号的时候,比如new或delete。
如果写成不加空格的operatornew和operatordelete,则它们都是合法的普通函数名。
因此,如果要编写这些运算符的运算符函数,则必须在关键字operator和运算符名称之间加个空格。
注意,我们将函数声明为const,因为该函数不修改本类的数据成员。
在operator>
()运算符函数中,运算符的右操作数由函数形参定义,左操作数由this指针隐式定义。
因此,如果有下面这条if语句:
if(box1
>
box2)
cout
<
endl
"
box1
is
than
box2"
;
则括弧中的表达式将调用重载的运算符函数,它与下面这个函数调用等价:
box1.operator>
(box2);
表达式中的CBox对象与运算符函数形参之间的对应关系如图8-3所示。
图
8-3
下面介绍operator>
()函数的工作原理:
Operator
function
for
which
compares
volumes
CBox
objects.
CBox:
(const
CBox&
const
return
this->
Volume()
aBox.Volume();
}
该函数使用引用形参,以避免被调用时不必要的复制开销。
因为该函数不需要修改调用它的对象,所以可将其声明为const。
如果不这样做,我们将根本不能使用该运算符比较CBox类型的const对象。
return表达式使用成员函数Volume()计算this指向的CBox对象的体积,然后使用基本运算符>
,将结果与对象aBox的体积进行比较。
基本运算符>
返回int(而非bool)类型的数值,因此如果指针this指向的对象比作为引用实参传递的对象aBox的体积大,则返回1,否则返回0。
比较结果将自动转换为该运算符函数的返回类型bool。
试一试:
我们可以通过如下示例练习如何使用operator>
()函数。
Ex8_03.cpp
Exercising
overloaded
operator
#include
iostream>
For
stream
I/O
using
std:
cout;
endl;
Class
definition
at
global
scope
Constructor
definition
CBox(double
lv
=
1.0,
double
wv
hv
1.0):
m_Length(lv),
m_Width(wv),
m_Height(hv)
called."
Function
to
calculate
volume
a
box
m_Length*m_Width*m_Height;
Destructor
~CBox()
private:
m_Length;
Length
box
in
inches
m_Width;
Width
m_Height;
Height
that
int
main()
smallBox(4.0,
2.0,
1.0);
mediumBox(10.0,
4.0,
2.0);
bigBox(30.0,
20.0,
40.0);
if(mediumBox
smallBox)
endl
mediumBox
bigger
smallBox"
bigBox)
bigBox"
else
not
0;
示例说明
()运算符函数的原型出现在类的public部分。
由于函数定义在类定义外部,因此该函数默认不是内联函数。
这样安排是非常随意的。
我们完全可以将函数定义放在类定义中原型的位置,这种情况下将不需要在函数名前面用CBox:
加以限定。
我们记得,当某个函数成员在类定义外部定义时,为了告诉编译器该函数是CBox类的成员,必须用类名进行限定。
main()函数中有两条对类成员使用>
运算符的if语句,它们将自动调用我们实现的重载运算符。
如果想确认这一点,那么可以给运算符函数添加一条输出语句。
该示例的输出如下:
called.
smallBox
bigBox
输出证实,使用运算符函数的if语句工作正常,因此直接用CBox对象表示CBox问题的解决方案开始成为很现实的命题。
8.4.2
实现对运算符的完全支持
使用前面实现的operator>
()运算符函数,我们仍然有许多事情不能做。
用CBox对象指定问题的解决方案完全可能涉及像下面这样的语句:
if(aBox
20.0)
Do
something...
我们的函数不会处理这里的表达式。
如果试图使用比较CBox对象与数值的表达式,那么将得到一条出错消息。
为了支持该功能,需要编写另一个版本的operator>
()函数作为重载函数。
要支持刚刚看到的表达式类型非常容易。
类定义内的成员函数声明将如下所示:
Compare
object
with
constant
double&
value)
该语句应出现在类定义中,>
运算符的右操作数对应于这里的函数形参。
作为左操作数的CBox对象是由隐式指针this传递的。
该重载运算符的实现同样很容易,函数体内只有一条语句:
compare
value;
没有比这更简单的事情了,不是吗?
但使用>
运算符处理CBox对象仍然存在问题。
我们有可能希望写出下面这样的语句:
if(20.0
aBox)
do
有人可能争辩说,通过实现接受double类型右实参的operator<
()运算符函数,然后相应改写上面这条语句,同样可以完成相同的功能,这么说非常正确。
实际上无论如何,实现<
运算符都可能是比较CBox对象所必需的。
但是,在实现对某种对象类型的支持时,我们不应该人为限制在表达式中使用这种对象的方式。
对象的使用应该尽可能自然。
现在的问题是如何来做。
成员运算符函数总是以左边的实参作为指针this。
因为本例中左边的实参是double类型,所以我们不能以成员函数的形式实现该运算符。
剩下的只有两种选择:
普通函数或友元函数。
我们不需要访问CBox类的private成员,所以该函数不必是友元函数。
因此,我们可以将左操作数属于double类型的重载>
运算符实现为普通函数。
由于该函数不是成员函数,其原型当然应该放在类定义的外部:
value,
const
aBox);
该函数的实现如下:
comparing
constant
object
value
正如前面曾经看到的那样,普通函数(就这一点而论也包括友元函数)使用直接成员选择运算符和对象名访问对象的成员。
当然,普通函数只能访问公有成员。
成员函数Volume()是公有的,因此这里使用该函数没有什么问题。
如果CBox类没有公有函数Volume(),我们可以直接使用能够访问私有数据成员的友元函数,或者提供一组返回私有数据成员数值的成员函数,然后在普通函数中使用这些函数来实现比较功能。
完成>
运算符的重载
我们可以在示例中将所有这些放在一起,以说明实际的工作过程:
Ex8_04.cpp
Implementing
complete
{
prototype
50.0)
capacity
more
50"
if(10.0
smallBox
less
10"
注意普通版本operator>
()函数的原型所处的位置。
该原型需要跟在类定义后面,因为其形参列表中要引用CBox对象。
如果我们将其放在类定义前面,则该示例将不能编译。
有一种将其放在程序文件开头#include语句后面的方法:
使用未完成的类声明。
这样该函数的原型就可以放在类定义之前,声明语句如下所示:
CBox;
Incomplete
declaration
未完成的类声明告诉编译器CBox是一个类,这足以使编译器正确处理第二行的函数原型,因为它现在知道CBox是后面将要定义的用户定义类型。
如果有两个类,而每个类都有一个指针成员指向另一个类的对象,在此类情形中我们同样需要上述机制。
这两个类都要求另一个类首先被声明,通过使用未完成的类声明就可以打破这样的僵局。
50
10
在构造函数因对象smallBox和mediumBox的声明而输出消息之后,我们从3条if语句中得到3行输出,每条语句都像我们预期的那样工作。
其中第一条语句调用属于类成员的运算符函数,比较CBox类的两个对象。
第二条语句调用形参类型为double的成员函数。
第三条if语句中的表达式调用以普通函数形式实现的运算符函数。
碰巧的是,两个属于类成员的运算符函数亦可以普通函数的形式实现,因为它们只需要访问公有成员函数Volume()。
注意:
以完全相同的实现大于运算符的方法,我们可以实现任何比较运算符。
它们仅仅在次要细节方面不同,大体的实现方法则完全相同。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载
![提示](https://static.bdocx.com/images/bang_tan.gif)