c++第10章运算符重载概要

上传人:今*** 文档编号:107207496 上传时间:2019-10-18 格式:PPT 页数:67 大小:800KB
返回 下载 相关 举报
c++第10章运算符重载概要_第1页
第1页 / 共67页
c++第10章运算符重载概要_第2页
第2页 / 共67页
c++第10章运算符重载概要_第3页
第3页 / 共67页
c++第10章运算符重载概要_第4页
第4页 / 共67页
c++第10章运算符重载概要_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《c++第10章运算符重载概要》由会员分享,可在线阅读,更多相关《c++第10章运算符重载概要(67页珍藏版)》请在金锄头文库上搜索。

1、第10 章 运算符重载,第 10 章 运算符重载,导入 函数重载 构造函数重载 普通成员函数重载 一般函数重载 为什么需要运算符重载?,例:一个日期类对象加上若干天数,应该仍是日期 Date d1(2001,12,1); int s=10; 应能得到:20011211 即运算: d1=d1+s; 是合理的 C的语法问题:“”运算的操作数是什么? “”只定义了对内部数据类型int char(字符) float(double)进行算术运算,例:字符串相加操作 char a10=“Hello “; char b10=“World”; char c20=a+b;,严重的语法问题: 类型不一致; a+b

2、无意义 “”不作串连接运算,#include using namespace std; class Complex /定义Complex类 public: Complex( )real=0;imag=0; /定义构造函数 Complex(double r,double i) real=r;imag=i; /构造函数重载 Complex complex_add(Complex ,例1: 通过函数来实现复数相加,Complex Complexcomplex_add(Complex ,int main( ) Complex c1(3,4),c2(5,-10),c3; /定义3个复数对象 c3=ple

3、x_add(c2); /调用复数相加函数 coutc1=; c1.display( ); /输出c1的值 coutc2=; c2.display( ); /输出c2的值 coutc1+c2=; c3.display( ); /输出c3的值 return 0; ,调用方式不直观、太烦琐,使人感到很不方便,能否也和整数的加法运算一样,直接用加号“+”来实现复数运算呢?,为什么运算符可以重载? 运算符的运算特性 2 * ( A + B ) / ( C - D ) Div( Mult (2, Add ( A, B) ), Sub ( C, D ) ) operator / (operator * (

4、2, operator + ( A, B ) ), operator - (C, D) 一个表达式运算是一个嵌套的函数调用,操作符只是函数的语法变体,他们的基础语义是相同的。 由于C+对操作符的表示语法的限定,当将操作符写成函数调用表达形式时,必须在操作符之前冠以关键字 operator。 使用标识符或操作符命名函数时,不同之处在于:以标识符命名的函数可以有任意个参数,而以操作符命名的函数只能有一个或两个参数;程序员不能定义新的操作符。,通过运算符重载实现对象的运算操作: 运用类机制 重载运算符 保持运算符概念上的一致性,#include using namespace std; class

5、Complex /定义Complex类 public: Complex( )real=0;imag=0; /定义构造函数 Complex(double r,double i) real=r;imag=i; /构造函数重载 Complex operator+ (Complex ,例2: 通过运算符重载来实现复数相加,Complex Complex operator+(Complex ,int main( ) Complex c1(3,4),c2(5,-10),c3; /定义3个复数对象 c3= c1c2; /调用复数相加函数 coutc1=; c1.display( ); /输出c1的值 cou

6、tc2=; c2.display( ); /输出c2的值 coutc1+c2=; c3.display( ); /输出c3的值 return 0; ,调用方式直观、不烦琐,使人感到很方便,重载运算符的规则-1 C+不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。 不能重载的运算符只有5个 . (成员访问运算符) * (成员指针访问运算符) (域运算符) sizeof (长度运算符) ? : (条件运算符) 重载不能改变运算符运算对象(即操作数)的个数。 重载不能改变运算符的优先级别。 重载不能改变运算符的结合性。,重载运算符的规则-2 重载运算符的函数不能有默认的参数,否则就改变

7、了运算符参数的个数,与前面第(3)点矛盾。 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数。,用成员函数重载操作符 一般格式,重载运算符函数的定义:(成员函数的形式) type class_name:operator (参数列表) 双目运算符带一个参数, 单目运算符不带参数.,被重载的

8、运算符,运算符函数 所属的类,运算后的返回值,若操作符是单目的,则参数表为空,当前对象作为操作符的单操作数;若操作符是双目的,则参数表中有一个操作数,当前对象作为此操作符的左操作数,参数表中的操作数作为此操作符的右操作数。 对于双目运算符,如果将它重载为某类的成员函数,使之能实现表达式 oprd1 oprd2,则该表达式相当于:函数调用oprd1.operate (oprd2)。 重载过的操作符与该操作符的本来含义不冲突,使用时只根据操作符出现的位置来判别具体执行哪一种运算。,例3: #include class CPoint int x, y ; public: CPoint ( int v

9、x, int vy) x = vx ; y = vy ; CPoint ( ) x = 0; y = 0; CPoint operator + ( CPoint p1); CPoint operator - ( CPoint p1); void Print () coutxy“n”; ; CPoint CPoint : operator + (CPoint p1) CPoint p; p.x = x + p1.x; p.y = y + p1.y; return p; ,CPoint CPoint : operator - (CPoint p1) CPoint p; p.x = x - p1.x

10、; p.y = y - p1.y; return p; int main( ) CPoint p1(10,10), p2(20,20) ; p1 = p1 + p2;/ 等价于p1.operate +(p2) p2 = p1 p2; / 等价于p1.operate -(p2) p1.Print( ); p2.Print( ); return 0; ,#include using namespace std; class Complex /定义Complex类 public: Complex( )real=0;imag=0; /定义构造函数 Complex(double r,double i)

11、real=r;imag=i; /构造函数重载 Complex operator+ (Complex ,通过运算符重载来实现复数相加,例2: 通过运算符重载来实现复数相加,Complex Complex operator+(Complex ,这里real和image属于哪个对象?,int main( ) Complex c1(3,4),c2(5,-10),c3; /定义3个复数对象 c3= c1c2; /调用复数相加函数 coutc1=; c1.display( ); /输出c1的值 coutc2=; c2.display( ); /输出c2的值 coutc1+c2=; c3.display(

12、); /输出c3的值 return 0; ,C+编译系统将程序中的表达式c1+c2解释为: c1.operator+(c2) 即通过对象c1调用运算符重载函数: Complex operator + (Complex &c2),用友元函数重载操作符 一般格式,重载运算符函数的定义:(友元函数的形式) friend type operator (参数列表) 双目运算符带两个参数, 单目运算符带一个参数.,被重载的运算符,运算后的返回值,前例中: class CPoint int x, y ; public: / friend CPoint operator + ( CPoint p1, CPoi

13、nt p2); ; CPoint operator + ( CPoint p1, CPoint p2) CPoint p; p.x = p1.x + p2.x; p.y = p1.y + p2.y; return p; ,#include using namespace std; class Complex /定义Complex类 public: Complex( )real=0;imag=0; /定义构造函数 Complex(double r,double i) real=r;imag=i; /构造函数重载 friend Complex operator+ (Complex ,通过友元重载运

14、算符来实现复数相加,例4: 通过友元重载运算符来实现复数相加,friend Complex operator+(Complex ,int main( ) Complex c1(3,4),c2(5,-10),c3; /定义3个复数对象 c3= c1c2; /调用复数相加函数 coutc1=; c1.display( ); /输出c1的值 coutc2=; c2.display( ); /输出c2的值 coutc1+c2=; c3.display( ); /输出c3的值 return 0; ,C+编译系统将程序中的表达式c1+c2解释为: operator+(c1,c2) 即相当于调用以下函数:

15、Complex operator + (Complex &c1,Complex &c2),运算符重载小结 使用类的成员函数 使用类的友元函数 普通函数(既非类的成员函数也不是友元函数) 重载函数的选择 普通函数基本不用(为什么?) 有的运算符必须用类的成员函数重载 赋值运算符 下标运算符 函数调用运算符 有的运算符则不能用类的成员函数重载 流插入运算符“” 类型转换运算符,如果将运算符重载函数作为成员函数,必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象。 例:将一个复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式: Complex Complexoperator+(int 数学运算的交换定律不一定适合! 如果希望适用交换律,则应写出相应重载函数,等价于c2=i+c1吗?,例:重载运算符,使表达式i+c1和c1+i都合法 Complex operator+(Complex /运算符重载函数不是成员函数,友元函数,课堂练习 设计一个三角形类Triangle,包含三角形三条边的私有数据

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号