C++程序设计运算符重载.ppt
文本预览下载声明
C++面向对象程序设计教程 第4章 运算符重载 运算符重载的概念 C++语言允许重新定义已有的运算符,使其完成一些只在该特定类中使用的特定操作,这就是运算符重载 如用加法“+”运算符进行两个复数的相加。若有z1=2+3i,z2=4-8i,在数学中,可直接用“+”实现z3=z1+z2,也就是将z1和z2的实部和虚部分别相加,z3=2+4+(3-8)i=6-5i。这时必须实现复数相加。比如用户可以通过定义一个函数来实现复数相加 运算符重载 能否像实数的加法运算一样,直接用加号“+”来实现复数运算呢?例如在程序中直接用“z3=z1+z2”进行运算,这需要对运算符“+”进行重载。 运算符重载的方法在实质上就是定义一个重载运算符的函数,在执行被重载的运算符时,系统将调用此函数实现相应的运算。运算符重载本质就是函数的重载。 重载运算符的函数的原型如下: 返回值类型operator运算符(形参表); 例如将“+”用于Complex类的加法运算运算符重载的函数原型可以为: Complex operator+(const Complex z1, const Complex z2); 运算符重载方式 C++的运算符按参加运算的操作数个数可分为单目运算符、双目运算符、三目运算符以及不确定目数运算符 单目运算符只有一个操作数,例如!p(取反运算符),-b(负号运算符)等 双目运算符有两个操作数参与运算,例如2+3(加法运算符),a=b(赋值运运算符)等 三目运算符有三个操作数参与运算,三目运算符只包括问号运算符,行例如z?x:y 不确定目数运算符是操作数个数不确定,可根据需要重载为不同的操作数个数,不确定目数运算符只包括函数调用运算符“()” 在C++中只能重载单目运算符、双目运算符及不确定目数运算符“()” 4.2.1 运算符重载为类的成员函数 通过该类的对象来调用运算符函数,由于对象本身将作为一个操作数,因此要求第一个操作数的类型为用户自定义类,参数表中的参数个数比操作数个数少一。 下面是运算符重载为类的成员函数的一般形式: class 类名 { private: // 数据成员 …… public: // 公有函数 返回值类型 operator运算符(形参表);// 运算符重载为类的成员函数 …… }; 其中“operator运算符”是运算符函数的专用函数名。 用类的成员函数重载单目运算符 单目运算符的运算符在一般情况下重载为类的成员函数时,形参表为 空,以当前对象(即调用该运算符函数的对象)作为运算符唯一的操 作数。 / / / /ysj/hljdxb/ 用类的成员函数重载双目运算符 双目运算符重载为类的成员函数时,形参表中有一个参数,以当前对象作为运算符的左操作数,参数作为右操作数。 4.2.2 运算符重载为类的友元函数 可以像将运算符重载为类的友元函数,这时参数表中的参数个数与操作数个相等,并且操作数的第一个操作数的类型不要求是用户自定义类。 下面是运算符重载为类的友元函数的一般形式: class 类名 { private: // 数据成员 …… public: // 公有函数 friend 返回值类型 operator运算符(形参表);// 运算符重载为类的友元函数 …… }; 由于是友元函数,因此在函数原型前应加上关键字friend。 用类的友元函数重载单目运算符 将单目运算符重载为类的友元函数时,友元函数形参表中有一个参数作为该运算符的操作数。 用类的友元函数重载双目运算符 将双目运算符重载为类的友元函数时,友元函数形参表中包含有两个参数,这两个参数分别作为运算符的左、右操作数。 4.2.3 运算符重载为普通函数 可以将运算符重载为普通函数,这时参数表中的参数个数与操作数个相等,并且第一个操作数的类型不要求是用户自定义类。 下面是运算符重载为普通函数的一般形式: 返回值类型 operator运算符(形参表); 由于是普通函数,因此在函数原型前不应加上关键字friend。 用普通函数重载单目运算符 将单目运算符重载为普通函数时,函数形参表中有一个参数作为该运算符的操作数。 用普通函数重载重载双目运算符 将双目运算符重载为普通函数时,函数形参表中包含有两个参数,这两个参数分别作为运算符的左、右操作数。 运算符重载 一般地讲,单目运算符最好重载为类的成员函数,双目运算符最好重载为类的友元函数或普通函数。 *4.3.1 重载赋值运算符“=” 由于赋值运算符重载后实现将一个表达式的值赋值给用户自定义对象,也就是赋值运算符的第一个操作数是类型为用户自定义类的对象,因此C++规定赋值运算符“=”只能重载为类的成员函数,一般重载格式为: 类名 类名::operator=(const 类名 源对象) { if
显示全部