联系方式:北京源智天下科技有限公司第十三讲:运算符重载杨章伟e-mail:jtclass@163.com1-2北京源智天下科技有限公司联系方式:课程内容安排•运算符重载简介•运算符重载的形式•特殊运算符的重载•类类型转换•综合练习•思考和习题1-3北京源智天下科技有限公司联系方式:运算符重载简介•简单来说,运算符重载是实现编译时的多态性的另外一种形式。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,导致不同类型的行为。•运算符重载的实质是函数重载。事实上,C++语言中的每一个运算符对应着一个运算符函数,在实现过程中,把指定的运算表达式中的运算符转化为对运算符函数的调用,而表达式中的运算对象转化为运算符函数的实参,这个过程是在编译阶段完成的。1-4北京源智天下科技有限公司联系方式:运算符重载的特点•尽管运算符重载是一种特殊的函数重载,但相比函数重载,运算符重载有着自身的一些特点。使用operator关键字对重载函数进行标识和定义。运算符有3种形式,即中缀、后缀、前缀,它们的operator表示形式如表13-1所示。运算符分类常规表示operator表示形式参数个数中缀a+boperator+(a,b)二元前缀-aoperator-(a,0)一元后缀a++operator++(a)一元1-5北京源智天下科技有限公司联系方式:可重载的运算符•需要读者注意的是,并不是所有的运算符都能被重载,下班列出了可被重载的运算符。+-*/%^&|~!=+=-=*=/=%=^=&=|========&&||=======&&||++-{}()-,newnew[]deleteelete[]类型转换运算符1-6北京源智天下科技有限公司联系方式:运算符重载的形式•运算符的重载形式有两种:•一种是重载为类的成员函数,•一种是重载为类的友元函数,1-7北京源智天下科技有限公司联系方式:重载为类的成员函数•将运算符重载为它将要操作的类的成员函数,称为成员运算符函数。实际使用时,总是通过该类的某个对象访问重载的运算符。一般来说,成员运算符函数在类内进行声明,在类外进行定义。成员运算符在类内声明的一般形式为:•返回类型operator运算符(参数表);•在类外定义的一般形式为:•返回类型类名∷operator运算符(参数表)•{•函数体•}1-8北京源智天下科技有限公司联系方式:运算符重载为类的友元函数•将重载的运算符函数定义为类的友元函数,称为友元运算符函数。友元运算符函数不是类的成员,其在类内声明原型,在类外定义函数本身。由于友元运算符函数不是类的成员函数,不属于任何一个类对象,所以没有this指针,因此,重载双目运算符时要有两个参数,重载单目运算符时只要一个参数就可以了。一般来说,友元运算符函数在类内声明的一般形式为:•friend返回类型operator运算符(参数表);•在类外定义的一般形式为:•返回类型operator运算符(参数表)•{•函数体•}1-9北京源智天下科技有限公司联系方式:特殊运算符的重载•“++”和“--”的重载•赋值运算符“=”的重载•下标运算符“[]”的重载1-10北京源智天下科技有限公司联系方式:类类型转换类类型是指某个对象的数据类型为类,而不是标准的数据类型。在C++中,标准的数据类型与类类型之间的转换有三种方法:通过构造函数转换:通过构造函数能将标准数据类型向类类型转换,但不能将类类型转换为标准类型。通过类类型转换函数转换:要将类类型转换为标准数据类型时,需要采用显式类型转换机制,定义类类型转换函数。通过运算符重载实现类型转换:可以实现标准类型的数据与类对象之间的运算。其中,通过类类型转换函数转换需要定义一个类的类型转换函数。一般来说,C++中定义一个类的类型转换函数的形式为:类名::operatortype(){//returntype类型的数据//返回type类型的对象}1-11北京源智天下科技有限公司联系方式:综合练习•该范例关于给复数运算重载复数的四则运算符。复数由实部和虚部构造,可以定义一个复数类,然后再在类中重载复数四则运算的运算符。1-12北京源智天下科技有限公司联系方式:思考和习题•C++中为什么要支持运算符重载,其好处如何体现?•运算符重载的规则有哪些?•运算符重载有两种形式,其分别是什么?•写一个程序测试输入的长度能否构成一个三角形。构成三角形的条件是任意两边之和大于第三边。