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