《(中职)编程语言基础------C++模块10教学课件.ppt》由会员分享,可在线阅读,更多相关《(中职)编程语言基础------C++模块10教学课件.ppt(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、YCF正版可修改PPT(中职)编程语言基础-C+模块10教学课件模块模块10运算符重载运算符重载任务任务1运算符重载的定义运算符重载的定义任务任务2运算符重载规则运算符重载规则任务任务3运算符重载的两种形式运算符重载的两种形式任务任务4特殊运算符重载举例特殊运算符重载举例返回任务任务1运算符重载的定义运算符重载的定义重载是面向对象设计的重要特征,运算符重载是对已有的运算符赋予重载是面向对象设计的重要特征,运算符重载是对已有的运算符赋予重载是面向对象设计的重要特征,运算符重载是对已有的运算符赋予重载是面向对象设计的重要特征,运算符重载是对已有的运算符赋予多重含义,使用同一个运算符作用于不同类型的
2、数据导致不同的行为。多重含义,使用同一个运算符作用于不同类型的数据导致不同的行为。多重含义,使用同一个运算符作用于不同类型的数据导致不同的行为。多重含义,使用同一个运算符作用于不同类型的数据导致不同的行为。C+C+中经重载后的运算符能直接对用户自定义的数据进行操作运算,中经重载后的运算符能直接对用户自定义的数据进行操作运算,中经重载后的运算符能直接对用户自定义的数据进行操作运算,中经重载后的运算符能直接对用户自定义的数据进行操作运算,这就是这就是这就是这就是C+C+语言中的运算符重载所提供的功能。运算符重载进一步提语言中的运算符重载所提供的功能。运算符重载进一步提语言中的运算符重载所提供的功能
3、。运算符重载进一步提语言中的运算符重载所提供的功能。运算符重载进一步提高了面向对象的灵活性、可扩充性和可读性。高了面向对象的灵活性、可扩充性和可读性。高了面向对象的灵活性、可扩充性和可读性。高了面向对象的灵活性、可扩充性和可读性。下一页返回任务任务1运算符重载的定义运算符重载的定义上一页 下一页返回任务任务1运算符重载的定义运算符重载的定义对于上述的复数类的两个对象对于上述的复数类的两个对象对于上述的复数类的两个对象对于上述的复数类的两个对象oneone和和和和twotwo,不能直接用,不能直接用,不能直接用,不能直接用“one+two”one+two”来来来来表示两个复数的相加。但为了符合人
4、们的习惯,有时希望对于新的数表示两个复数的相加。但为了符合人们的习惯,有时希望对于新的数表示两个复数的相加。但为了符合人们的习惯,有时希望对于新的数表示两个复数的相加。但为了符合人们的习惯,有时希望对于新的数据类型仍然使用已有的一些运算符进行操作,如果希望用据类型仍然使用已有的一些运算符进行操作,如果希望用据类型仍然使用已有的一些运算符进行操作,如果希望用据类型仍然使用已有的一些运算符进行操作,如果希望用“+”+”来表来表来表来表示两个复数的加法,这就需要对运算符示两个复数的加法,这就需要对运算符示两个复数的加法,这就需要对运算符示两个复数的加法,这就需要对运算符“+”+”进行重载。进行重载。
5、进行重载。进行重载。上一页 下一页返回任务任务1运算符重载的定义运算符重载的定义操作符是系统预先定义好的一些函数名称,所以,可以把运算符重载操作符是系统预先定义好的一些函数名称,所以,可以把运算符重载操作符是系统预先定义好的一些函数名称,所以,可以把运算符重载操作符是系统预先定义好的一些函数名称,所以,可以把运算符重载看作是函数重载的一种特殊形式,对于运算符的重载和函数的重载是看作是函数重载的一种特殊形式,对于运算符的重载和函数的重载是看作是函数重载的一种特殊形式,对于运算符的重载和函数的重载是看作是函数重载的一种特殊形式,对于运算符的重载和函数的重载是类似的,都是使同一个名称具有多重含义,它
6、体现了面向对象的程序类似的,都是使同一个名称具有多重含义,它体现了面向对象的程序类似的,都是使同一个名称具有多重含义,它体现了面向对象的程序类似的,都是使同一个名称具有多重含义,它体现了面向对象的程序设计的多态性。设计的多态性。设计的多态性。设计的多态性。只有类的成员函数和类的友元函数才能够访问类的私有数据成员,只有类的成员函数和类的友元函数才能够访问类的私有数据成员,只有类的成员函数和类的友元函数才能够访问类的私有数据成员,只有类的成员函数和类的友元函数才能够访问类的私有数据成员,因此只有将运算符重载为类的成员函数或是类的友元函数时,才能使因此只有将运算符重载为类的成员函数或是类的友元函数时
7、,才能使因此只有将运算符重载为类的成员函数或是类的友元函数时,才能使因此只有将运算符重载为类的成员函数或是类的友元函数时,才能使被重载的运算符能够对新的数据类型进行操作。被重载的运算符能够对新的数据类型进行操作。被重载的运算符能够对新的数据类型进行操作。被重载的运算符能够对新的数据类型进行操作。上一页返回任务任务2运算符重载规则运算符重载规则在对运算符进行重载时要遵循以下一些规则。在对运算符进行重载时要遵循以下一些规则。在对运算符进行重载时要遵循以下一些规则。在对运算符进行重载时要遵循以下一些规则。(1)(1)被重载的运算符一定不能是下面这些运算符中的任意一个被重载的运算符一定不能是下面这些运
8、算符中的任意一个被重载的运算符一定不能是下面这些运算符中的任意一个被重载的运算符一定不能是下面这些运算符中的任意一个:“.”“.”类成员运算符类成员运算符类成员运算符类成员运算符“*”“*”指针运算符指针运算符指针运算符指针运算符“:”:”类作用域运算符类作用域运算符类作用域运算符类作用域运算符“?:”?:”条件运算符条件运算符条件运算符条件运算符除此之外,除此之外,除此之外,除此之外,c+c+的其他运算符都可以重载。的其他运算符都可以重载。的其他运算符都可以重载。的其他运算符都可以重载。下一页返回任务任务2运算符重载规则运算符重载规则 (2)(2)运算符被重载后,不能改变优先级和结合性,也不
9、能改变语法结运算符被重载后,不能改变优先级和结合性,也不能改变语法结运算符被重载后,不能改变优先级和结合性,也不能改变语法结运算符被重载后,不能改变优先级和结合性,也不能改变语法结构,即不能将单日运算符重载为双日运算符。构,即不能将单日运算符重载为双日运算符。构,即不能将单日运算符重载为双日运算符。构,即不能将单日运算符重载为双日运算符。(3)(3)被重载的运算符必须是系统预先已经定义好的运算符,即不能自被重载的运算符必须是系统预先已经定义好的运算符,即不能自被重载的运算符必须是系统预先已经定义好的运算符,即不能自被重载的运算符必须是系统预先已经定义好的运算符,即不能自己定义新的运算符。己定义
10、新的运算符。己定义新的运算符。己定义新的运算符。(4)(4)被重载的运算符虽然可以用来做任何事情,但是最好还是应使其被重载的运算符虽然可以用来做任何事情,但是最好还是应使其被重载的运算符虽然可以用来做任何事情,但是最好还是应使其被重载的运算符虽然可以用来做任何事情,但是最好还是应使其新的功能与系统预先定义的功能相似,使人容易理解。新的功能与系统预先定义的功能相似,使人容易理解。新的功能与系统预先定义的功能相似,使人容易理解。新的功能与系统预先定义的功能相似,使人容易理解。上一页返回任务任务3运算符重载的两种形式运算符重载的两种形式 重载运算符的日的是重载运算符的日的是重载运算符的日的是重载运算
11、符的日的是:对于有类对象参与的运算,使其表达式看起来对于有类对象参与的运算,使其表达式看起来对于有类对象参与的运算,使其表达式看起来对于有类对象参与的运算,使其表达式看起来像基本类型数据那样一日了然,与我们熟悉的数学表达形式一致。因像基本类型数据那样一日了然,与我们熟悉的数学表达形式一致。因像基本类型数据那样一日了然,与我们熟悉的数学表达形式一致。因像基本类型数据那样一日了然,与我们熟悉的数学表达形式一致。因此,运算符应该被重载为类的成员或友元函数,这样才能直接访问类此,运算符应该被重载为类的成员或友元函数,这样才能直接访问类此,运算符应该被重载为类的成员或友元函数,这样才能直接访问类此,运算
12、符应该被重载为类的成员或友元函数,这样才能直接访问类的私有数据成员。的私有数据成员。的私有数据成员。的私有数据成员。10.3.1运算符重载乃成员函数运算符重载乃成员函数将运算符重载为类的成员函数的格式为将运算符重载为类的成员函数的格式为将运算符重载为类的成员函数的格式为将运算符重载为类的成员函数的格式为:operator:operator)下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式【例例例例10-210-2】复数类加减运算重载复数类加减运算重载复数类加减运算重载复数类加减运算重载成员函数形式。成员函数形式。成员函数形式。成员函数形式。上一页 下一页返回任务任务3运算符重载的两
13、种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式10.3.2运算符重载为友元函数运算符重载为友元函数将运算符重载为友元函数的格式为将运算符重载为友元函数的格式为将运算符重载为友元函数的格式为将运算符重载为友元函数的格式为:friendfriend operator operator)【例例例例10-310-3】复数类加减法运算重载复数类加减法运算重
14、载复数类加减法运算重载复数类加减法运算重载友元函数形式。友元函数形式。友元函数形式。友元函数形式。上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式运行结果:运行结果:运行结果:运行结果:上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式10.3.3两种重载方式讨论两种重载方式讨论从上面的例子可以看出,运算符的两种重载形式都可以实现我们需要从上面的例子可以看
15、出,运算符的两种重载形式都可以实现我们需要从上面的例子可以看出,运算符的两种重载形式都可以实现我们需要从上面的例子可以看出,运算符的两种重载形式都可以实现我们需要的功能,而且主函数中执行运算的表达方式是一样的。但是成员函数的功能,而且主函数中执行运算的表达方式是一样的。但是成员函数的功能,而且主函数中执行运算的表达方式是一样的。但是成员函数的功能,而且主函数中执行运算的表达方式是一样的。但是成员函数和友元函数是不同的。从表面上看,友元函数比成员函数多一个形参,和友元函数是不同的。从表面上看,友元函数比成员函数多一个形参,和友元函数是不同的。从表面上看,友元函数比成员函数多一个形参,和友元函数是
16、不同的。从表面上看,友元函数比成员函数多一个形参,友元函数的参数对应参与运算的操作数。实际上,成员函数友元函数的参数对应参与运算的操作数。实际上,成员函数友元函数的参数对应参与运算的操作数。实际上,成员函数友元函数的参数对应参与运算的操作数。实际上,成员函数所在的对象就是第一个操作数,成员函数如果带参数则是第二个操作所在的对象就是第一个操作数,成员函数如果带参数则是第二个操作所在的对象就是第一个操作数,成员函数如果带参数则是第二个操作所在的对象就是第一个操作数,成员函数如果带参数则是第二个操作数。数。数。数。虽然有些运算符既可以重载为成员函数,又可以重载为友元函数虽然有些运算符既可以重载为成员
17、函数,又可以重载为友元函数虽然有些运算符既可以重载为成员函数,又可以重载为友元函数虽然有些运算符既可以重载为成员函数,又可以重载为友元函数;但但但但是一般而言,应将一元运算符重载为成员函数,将二元运算符重载为是一般而言,应将一元运算符重载为成员函数,将二元运算符重载为是一般而言,应将一元运算符重载为成员函数,将二元运算符重载为是一般而言,应将一元运算符重载为成员函数,将二元运算符重载为友元函数。如果运算符的第一个操作数为类对象,则运算符可以重载友元函数。如果运算符的第一个操作数为类对象,则运算符可以重载友元函数。如果运算符的第一个操作数为类对象,则运算符可以重载友元函数。如果运算符的第一个操作
18、数为类对象,则运算符可以重载为成员函数。为成员函数。为成员函数。为成员函数。“()”()”、“”、“一一一一”、“一一一一*”*”及及及及“=”=”必须重载为必须重载为必须重载为必须重载为成员函数成员函数成员函数成员函数)上一页 下一页返回任务任务3运算符重载的两种形式运算符重载的两种形式如果运算符有一个操作数不是当前类的类型,则运算符应重载为友元如果运算符有一个操作数不是当前类的类型,则运算符应重载为友元如果运算符有一个操作数不是当前类的类型,则运算符应重载为友元如果运算符有一个操作数不是当前类的类型,则运算符应重载为友元函数。例如,要计算函数。例如,要计算函数。例如,要计算函数。例如,要计
19、算(7.53(7.53一一一一cl)cl)的值,其中的值,其中的值,其中的值,其中cl cl是是是是COmp1exCOmp1ex类对象。类对象。类对象。类对象。如果利用友元函数重载形式,则该表达式被解释为如果利用友元函数重载形式,则该表达式被解释为如果利用友元函数重载形式,则该表达式被解释为如果利用友元函数重载形式,则该表达式被解释为:operator-(Complex(7.53)operator-(Complex(7.53),cl)cl)这个结果是合法的。在参数传递的过程中,首先调用转换构造函数这个结果是合法的。在参数传递的过程中,首先调用转换构造函数这个结果是合法的。在参数传递的过程中,首
20、先调用转换构造函数这个结果是合法的。在参数传递的过程中,首先调用转换构造函数将将将将7.537.53转换为转换为转换为转换为ComplexComplex类型。类型。类型。类型。我们将上面的讨论总结为我们将上面的讨论总结为我们将上面的讨论总结为我们将上面的讨论总结为表表表表10-110-1上一页返回任务任务4特殊运算符重载举例特殊运算符重载举例10.4.1 类型转换运算符类型转换运算符我们已经知道,类的转换构造函数可以将数据由其他类型转换为当前我们已经知道,类的转换构造函数可以将数据由其他类型转换为当前我们已经知道,类的转换构造函数可以将数据由其他类型转换为当前我们已经知道,类的转换构造函数可以
21、将数据由其他类型转换为当前的类类型。反过来,如果想将数据由当前的类类型转换为其他类型,的类类型。反过来,如果想将数据由当前的类类型转换为其他类型,的类类型。反过来,如果想将数据由当前的类类型转换为其他类型,的类类型。反过来,如果想将数据由当前的类类型转换为其他类型,则需要将类型转换运算符则需要将类型转换运算符则需要将类型转换运算符则需要将类型转换运算符“()”()”重载为类的成员函数。其声明形式为重载为类的成员函数。其声明形式为重载为类的成员函数。其声明形式为重载为类的成员函数。其声明形式为:类名类名类名类名:operator Type/:operator Type/类型转换成员函数类型转换成
22、员函数类型转换成员函数类型转换成员函数 该语句声明将数据由当前的类类型转换为该语句声明将数据由当前的类类型转换为该语句声明将数据由当前的类类型转换为该语句声明将数据由当前的类类型转换为TypeType类型,其中类型,其中类型,其中类型,其中“Type”Type”表示要转换的类型。注意该成员函数没有参数,没有返回类型,但函表示要转换的类型。注意该成员函数没有参数,没有返回类型,但函表示要转换的类型。注意该成员函数没有参数,没有返回类型,但函表示要转换的类型。注意该成员函数没有参数,没有返回类型,但函数体内必须有返回数体内必须有返回数体内必须有返回数体内必须有返回TypeType类型值的语句,如例
23、类型值的语句,如例类型值的语句,如例类型值的语句,如例10-410-4。下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例运行结果运行结果运行结果运行结果:3:3在执行在执行在执行在执行“int(c)”int(c)”时,实际上是调用对象时,实际上是调用对象时,实际上是调用对象时,实际上是调用对象c c的类型转换成员函数即的类型转换成员函数即的类型转换成员函数即的类型转换成员函数即 c.c.perator int().perator int().10.4.210.
24、4.2复合赋值运算符复合赋值运算符复合赋值运算符复合赋值运算符上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例在第模块在第模块在第模块在第模块4 4章中已经介绍了赋值运算符的重载方法。假设在类定义中,章中已经介绍了赋值运算符的重载方法。假设在类定义中,章中已经介绍了赋值运算符的重载方法。假设在类定义中,章中已经介绍了赋值运算符的重载方法。假设在类定义中,重载了赋值运算符重载了赋值运算符重载了赋值运算符重载了赋值运算符“=”=”和加法运算符和加法运算符和加法运算符和加法运算符“+”+”,那么复合赋值运算符,那么复合赋值运算符,那么复合赋值运算符,那么复合赋值运算符“+=”+=”是
25、不是就可以直接使用呢是不是就可以直接使用呢是不是就可以直接使用呢是不是就可以直接使用呢?答案是否定的。要想使答案是否定的。要想使答案是否定的。要想使答案是否定的。要想使“+=”+=”适用适用适用适用于类对象,必须单独进行重载。对于其他复合赋值运算符一也一样,于类对象,必须单独进行重载。对于其他复合赋值运算符一也一样,于类对象,必须单独进行重载。对于其他复合赋值运算符一也一样,于类对象,必须单独进行重载。对于其他复合赋值运算符一也一样,如例如例如例如例10-5.10-5.上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举
26、例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例运行结果运行结果运行结果运行结果:(6.7 (6.7,10.2)10.2)在执行在执行在执行在执行“c1+=c2;c1+=c2;时,实际上是以时,实际上是以时,实际上是以时,实际上是以c2c2为实参,调用对象为实参,调用对象为实参,调用对象为实参,调用对象c1c1的运算符的运算符的运算符的运算符重载函数,即重载函数,即重载函数,即重载函数,即c1.operator+=(c2);”c1.operator+
27、=(c2);”上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例10.4.3 有增和有减运算符有增和有减运算符自增运算符自增运算符自增运算符自增运算符“+”+”和自减运算符和自减运算符和自减运算符和自减运算符“-”-”都有前置和后置两种情况。下面都有前置和后置两种情况。下面都有前置和后置两种情况。下面都有前置和后置两种情况。下面以自增运算符为例,介绍两种情况的重载方法。自减与自增类似,不以自增运算符为例,介绍两种情况的重载方法。自减与自增类似,不以自增运算符为例,介绍两种情况的重载方法。自减与自增类似,不以自增运算符为例,介绍两种情况的重载方法。自减与自增类似,不再赘述。再赘述。
28、再赘述。再赘述。对于对于对于对于“inta=3;,+ainta=3;,+a的含义是的含义是的含义是的含义是“a a的值先加的值先加的值先加的值先加1 1再被使用再被使用再被使用再被使用”,。,。,。,。+的的的的含义是含义是含义是含义是“先使用。的先使用。的先使用。的先使用。的原值然后原值然后原值然后原值然后a a再加再加再加再加11。重载前置自增和后置自增时,应该保持原来的含。重载前置自增和后置自增时,应该保持原来的含。重载前置自增和后置自增时,应该保持原来的含。重载前置自增和后置自增时,应该保持原来的含义不变。义不变。义不变。义不变。前置前置前置前置+与后置与后置与后置与后置+重载为成员函
29、数的声明形式分别为重载为成员函数的声明形式分别为重载为成员函数的声明形式分别为重载为成员函数的声明形式分别为:上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例 consL consL类名类名类名类名&类名类名类名类名:operator+();/:operator+();/前置前置前置前置+重载为成员函数的声明形重载为成员函数的声明形重载为成员函数的声明形重载为成员函数的声明形式式式式 consLconsL类名类名类名类名类名类名类名类名:operator+(int);/:operator+(int);/后置后置后置后置+重载为成员函数的声重载为成员函数的声重载为成员函数的声重载
30、为成员函数的声明形式明形式明形式明形式 C+C+规定,后置一元运算符重载为成员函数时,带一个规定,后置一元运算符重载为成员函数时,带一个规定,后置一元运算符重载为成员函数时,带一个规定,后置一元运算符重载为成员函数时,带一个intint型参数。型参数。型参数。型参数。该参数在函数体内并不使用,其作用只是为了和前置运算符区分开。该参数在函数体内并不使用,其作用只是为了和前置运算符区分开。该参数在函数体内并不使用,其作用只是为了和前置运算符区分开。该参数在函数体内并不使用,其作用只是为了和前置运算符区分开。上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4
31、特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例上一页 下一页返回任务任务4特殊运算符重载举例特殊运算符重载举例 在执行在执行在执行在执行“+a”+a”时,实际上是调用对象时,实际上是调用对象时,实际上是调用对象时,实际上是调用对象a a的前置自增重载函数即的前置自增重载函数即的前置自增重载函数即的前置自增重载函数即 a.a.operator+();op
32、erator+();在执行在执行在执行在执行“b+”b+”时,实际上是调用对象时,实际上是调用对象时,实际上是调用对象时,实际上是调用对象b b的后置自增的后置自增的后置自增的后置自增重载函数即重载函数即重载函数即重载函数即 b.operator+(0)b.operator+(0),这时应提供一个实参,可以是任,这时应提供一个实参,可以是任,这时应提供一个实参,可以是任,这时应提供一个实参,可以是任意整数。意整数。意整数。意整数。10.4.4流提取运算符和流插入运算符流提取运算符和流插入运算符 在标准库的在标准库的在标准库的在标准库的istreamistream类中重载了提取类中重载了提取类中
33、重载了提取类中重载了提取(模块模块模块模块1 1中称作输人中称作输人中称作输人中称作输人)运算符运算符运算符运算符()(),在在在在ostreamostream类中重载了插人类中重载了插人类中重载了插人类中重载了插人(模块模块模块模块1 1中称作输出中称作输出中称作输出中称作输出)运算符运算符运算符运算符()(a;”cina;”时,实际上是调用流提取重载函数,即时,实际上是调用流提取重载函数,即时,实际上是调用流提取重载函数,即时,实际上是调用流提取重载函数,即 operator(cin,a);operator(cin,a);在执行在执行在执行在执行 couta;”couta;”时,实际上是调用流插人时,实际上是调用流插人时,实际上是调用流插人时,实际上是调用流插人重载函数,即重载函数,即重载函数,即重载函数,即 operator(cout,a);.operator(cout,a);.关于其他运算符的重载,不再一一举例,感兴趣的读者可以自己编关于其他运算符的重载,不再一一举例,感兴趣的读者可以自己编关于其他运算符的重载,不再一一举例,感兴趣的读者可以自己编关于其他运算符的重载,不再一一举例,感兴趣的读者可以自己编程实现。程实现。程实现。程实现。上一页返回表表10-1运算符重载方式运算符重载方式返回