• 1. 第13章 运算符重载 杨章伟 e-mail:yang505412@163.com
  • 2. 课程内容安排运算符重载简介 运算符重载的形式 特殊运算符的重载 类类型转换 小结 习题
  • 3. 运算符重载简介 第12章介绍了多态的实现技术,主要包括函数的重载和虚函数。事实上,本章介绍的运算符重载也是多态性实现的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预定义的运算符只是对基本数据类型进行操作,而对于自定义的数据类型比如类,却没有类似的操作。为了实现对自定义类型的操作,就必须自己编写程序来说明某个运算符作用在这些数据类型上时,应该完成怎样的操作,这就要引入运算符重载的概念。 简单地说,运算符重载是实现编译时多态性的另外一种形式。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,实现不同类型的行为。
  • 4. 运算符重载的定义 运算符重载的实质是函数重载。事实上,C++语言中的每一个运算符对应着一个运算符函数,在实现过程中,把指定的运算表达式中的运算符转化为对运算符函数的调用,而表达式中的运算对象转化为运算符函数的实参,这个过程是在编译阶段完成的。例如: int a=1,b=2; a+b; 表达式“a+b”在编译前,将被解释为函数调用形式:operator+(a,b)。其中,operator是一个关键字,它与后面的“+”共同组成了该运算符函数的函数名。因此,可以将运算符重载看作是一种特殊的函数重载。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }
  • 5. 运算符重载的规则 简单地说,实现运算符重载即编写一个函数,该函数以“operator运算符号”为函数名,其定义了重载的运算符将要执行的操作。此外,函数的形参类型必须是自定义的类型。当使用该运算符对形参规定的数据类型进行运算时,就执行函数体中的操作,而覆盖了原运算符的功能。 C++中的运算符除了几个不能重载外,其他的都能重载,而且只能重载已有的运算符,不能自己另编。 重载以后运算符的优先级和结合性都不能改变,语法结构也不能改变,即单目运算符只能重载为单目运算符,多目运算符只能重载为多目运算符。 运算符重载以后的功能应与原有功能类似,含义必须清楚,不能有二义性。
  • 6. 运算符重载的形式 运算符的重载形式有两种:一种是重载为类的成员函数,一种是重载为类的友元函数。对于每一种重载形式,由于运算符的不同,都可以将其主要分为双目运算符和单目运算符的实现。 重载为类的成员函数 : 双目运算符重载为成员函数 单目运算符重载为成员函数 重载为类的友元函数 : 双目运算符重载为友元函数 单目运算符重载为友元函数
  • 7. “++”和“--”的重载 前面范例中介绍了“++”和“--”的重载,但运算符“++”和“--”有前置和后置两种形式。例如,表达式“a++”和表达式“++a”是不一样的。 如果不区分前置和后置,则使用operator++()或operator--()即可;否则,要使用operator++()或operator--()来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。 【范例13-6】“++”和“--”运算符的重载。范例实现了运算符“++”和“--”的重载,包括其前置和后置两种形式
  • 8. 赋值运算符“=”的重载 除了前面讲解的算术运算符可以进行重载外,许多其他类型的运算符也可以进行重载,赋值运算符“=”也是如此。在进行赋值运算符“=”重载的应用前,读者应先了解赋值运算符“=”在实际程序中的运行情况。事实上,对于任何一个类,如果没有用户自定义的赋值运算符函数,系统会自动地为其生成一个默认的赋值运算符函数,以完成数据成员之间的复制。例如,下面的程序段: X & X::operator=(const X &source) { //类对象成员之间的赋值语句 } 一旦类X的两个对象ob1和ob2已创建,就可用ob1=ob2进行赋值了。
  • 9. 下标运算符“[ ]”的重载 下标运算符operator[]通常用来访问数组中的某个元素。事实上,其可以看作是一个双目运算符,第一个运算符是数组名,第二个运算符是数组下标。在类对象中,可以重载下标运算符,用它来定义相应对象的下标运算。 【范例13-8】下标运算符“[ ]”的重载。该范例实现了下标运算符“[ ]”的重载,重载后的下标运算符能够判断数组的下标是否越界,如越界则给出错误信息
  • 10. 类类型转换 类类型是指某个对象的数据类型为类,而不是标准的数据类型。在C++中,标准的数据类型与类类型之间的转换有三种方法。 通过构造函数转换:通过构造函数能将标准数据类型向类类型转换,但不能将类类型转换为标准类型。 通过类类型转换函数转换:要将类类型转换为标准数据类型时,需要采用显式类型转换机制,定义类类型转换函数。 通过运算符重载实现类型转换:可以实现标准类型的数据与类对象之间的运算。
  • 11. 【范例13-9】运算符重载转换运算符C++中定义一个类的类型转换函数的形式为: <类名>::operator type() { // return type类型的数据 //返回type类型的对象 } 范例在类中重载了一个类型转换函数int(),该函数实现输出并返回类类型值
  • 12. 本章主要介绍了运算符重载的相关内容。从运算符重载的定义和特点着手,通过一个具体的范例介绍运算符重载的优点,接着简要说明了运算符重载的规则。同时,重点讲解了两种形式的运算符重载:运算符重载为成员函数和运算符重载为友元函数。针对每一种重载方式,都通过一个范例介绍了双目运算符的重载和单目运算符的重载。此外,针对几种特殊运算符,本章通过实例讲解了赋值运算符、下标运算符等重载的实现。最后,就C++面向对象程序设计的基础概念和特征做了简要的概括。小结
  • 13. 1.定义计数器Counter类,对其重载运算符 +。 【解答】该试题主要考查双目运算符的重载实现。运算符的重载可以在类中进行定义,也可以在类外进行定义,但在类中必须进行说明。该试题首先定义一个计数器类,在公有成员中说明运算符的重载,在类外进行定义。 2.对Point类重载++(自增)、--(自减)运算符。 【解答】该试题主要考查单目运算符++(自增)、--(自减)的重载。读者需要注意,++(自增)、--(自减)均具有前置和后置的区别,其属于特殊运算符的重载。因此,在进行这两种运算符的重载时,需要考虑前置和后置。该试题首先定义类Point,在类中对运算符重载函数进行说明,在类外对重载函数进行具体定义。 习题
  • 14. 习题4.设计一个程序,重载四则运算符,实现复数的算术运算。 【解答】该试题主要考查算术运算符的重载。复数由实部和虚部构造,因此可以定义一个复数类,然后再在类中重载复数四则运算的运算符。具体的说,可以定义类complex,其中将四则运算符“+”、“-”、“×”和“/”都重载为类的成员函数,重载后的四则运算符能够实现复数的四则运算。同时声明一个友元函数用于输出运算结果。在主函数main()中创建三个对象,其中两个对象进行四则运算。