预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

8.4运算符重载运算符重载是非常重要的功能,因为它使我们能够使用像+、–、*这样的标准C++运算符,来处理自定义数据类型的对象。该功能允许我们编写重新定义特定运算符的函数,从而使该运算符处理类对象时执行特定的动作。例如,我们可以重新定义>运算符,从而使该运算符用于前面看到的CBox类对象时,如果第一个实参的体积比第二个大,就返回true。运算符重载功能不允许我们使用新的运算符,也不允许我们改变运算符的优先级,因此运算符的重载版本在计算表达式的值时优先级与原来的基本运算符相同。运算符的优先级表可以在本书第2章和MSDN库中找到。虽然我们不能重载所有运算符,但限制不是特别严格。下面给出不能重载的运算符:作用域解析运算符::条件运算符?:直接成员访问运算符.sizeof运算符sizeof解除对指向类成员的指针的引用运算符.*任何其他运算符都是可以重载的,这给予我们相当大的灵活性。显然,确保标准运算符的重载版本与原来的正常用途一致,或者至少在操作上相当直观,是合适的想法。如果为某个类重载的+运算符却执行使类对象相乘的操作,这可能就不是明智的做法。理解运算符重载机制如何工作的最好方法是完成一个示例,因此下面为CBox类实现刚才提到的大于运算符>。8.4.1实现重载的运算符为了给某个类实现重载的运算符,我们必须编写特殊的函数。假设在类定义内重载>运算符的函数是CBox类的成员,则该函数的声明如下所示:classCBox{public:booloperator>(CBox&aBox)const;//Overloaded'greaterthan'//Restoftheclassdefinition...};这里的单词operator是个关键字。该关键字结合运算符符号或名称,本例中是>,将定义一个运算符函数。本例中的函数名是operator>()。在运算符函数的声明中,关键字和运算符本身之间有无空格都行,前提是没有歧义。歧义出现在运算符是名称而非符号的时候,比如new或delete。如果写成不加空格的operatornew和operatordelete,则它们都是合法的普通函数名。因此,如果要编写这些运算符的运算符函数,则必须在关键字operator和运算符名称之间加个空格。注意,我们将函数声明为const,因为该函数不修改本类的数据成员。在operator>()运算符函数中,运算符的右操作数由函数形参定义,左操作数由this指针隐式定义。因此,如果有下面这条if语句:if(box1>box2)cout<<endl<<"box1isgreaterthanbox2";则括弧中的表达式将调用重载的运算符函数,它与下面这个函数调用等价:box1.operator>(box2);表达式中的CBox对象与运算符函数形参之间的对应关系如图8-3所示。图8-3下面介绍operator>()函数的工作原理://Operatorfunctionfor'greaterthan'which//comparesvolumesofCBoxobjects.boolCBox::operator>(constCBox&aBox)const{returnthis->Volume()>aBox.Volume();}该函数使用引用形参,以避免被调用时不必要的复制开销。因为该函数不需要修改调用它的对象,所以可将其声明为const。如果不这样做,我们将根本不能使用该运算符比较CBox类型的const对象。return表达式使用成员函数Volume()计算this指向的CBox对象的体积,然后使用基本运算符>,将结果与对象aBox的体积进行比较。基本运算符>返回int(而非bool)类型的数值,因此如果指针this指向的对象比作为引用实参传递的对象aBox的体积大,则返回1,否则返回0。比较结果将自动转换为该运算符函数的返回类型bool。试一试:运算符重载我们可以通过如下示例练习如何使用operator>()函数。//Ex8_03.cpp//Exercisingtheoverloaded'greaterthan'operator#include<iostream>//ForstreamI/Ousingstd::cout;usingstd::endl;classCBox//Classdefinitionatglobalscope{public://ConstructordefinitionCBox(doublelv=1.0,doublewv=1.0,doublehv=1.0):m_Length(lv),m_Width(wv),m_Height(hv){cout<<endl<<"Constructorcalled.";}//Functiontocalculatethevolumeofab