- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C第10章运算符重载概要
第10 章 运算符重载 第 10 章 运算符重载 导入 函数重载 构造函数重载 普通成员函数重载 一般函数重载 为什么需要运算符重载? 例:一个日期类对象加上若干天数,应该仍是日期 Date d1(2001,12,1); int s=10; 应能得到:2001/12/11 即运算: d1=d1+s; 是合理的 C++的语法问题:“+”运算的操作数是什么? “+”只定义了对内部数据类型int char(字符) float(double)进行算术运算 例:字符串相加操作 char a[10]=“Hello “; char b[10]=“World”; char c[20]=a+b; 为什么运算符可以重载? 运算符的运算特性 2 * ( A + B ) / ( C - D ) Div( Mult (2, Add ( A, B) ), Sub ( C, D ) ) operator / (operator * ( 2, operator + ( A, B ) ), operator - (C, D)) 一个表达式运算是一个嵌套的函数调用,操作符只是函数的语法变体,他们的基础语义是相同的。 由于C++对操作符的表示语法的限定,当将操作符写成函数调用表达形式时,必须在操作符之前冠以关键字 operator。 使用标识符或操作符命名函数时,不同之处在于:以标识符命名的函数可以有任意个参数,而以操作符命名的函数只能有一个或两个参数;程序员不能定义新的操作符。 重载运算符的规则-1 C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 不能重载的运算符只有5个 . (成员访问运算符) * (成员指针访问运算符) ∷ (域运算符) sizeof (长度运算符) ? : (条件运算符) 重载不能改变运算符运算对象(即操作数)的个数。 重载不能改变运算符的优先级别。 重载不能改变运算符的结合性。 重载运算符的规则-2 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“”不必用户重载。 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数。 用成员函数重载操作符 一般格式 若操作符是单目的,则参数表为空,当前对象作为操作符的单操作数;若操作符是双目的,则参数表中有一个操作数,当前对象作为此操作符的左操作数,参数表中的操作数作为此操作符的右操作数。 对于双目运算符B,如果将它重载为某类的成员函数,使之能实现表达式 oprd1B oprd2,则该表达式相当于:函数调用oprd1.operate B(oprd2)。 重载过的操作符与该操作符的本来含义不冲突,使用时只根据操作符出现的位置来判别具体执行哪一种运算。 用友元函数重载操作符 一般格式 运算符重载小结 使用类的成员函数 使用类的友元函数 普通函数(既非类的成员函数也不是友元函数) 重载函数的选择 普通函数基本不用(为什么?) 有的运算符必须用类的成员函数重载 赋值运算符 下标运算符 函数调用运算符 有的运算符则不能用类的成员函数重载 流插入运算符“” 流提取运算符“” 类型转换运算符 如果将运算符重载函数作为成员函数,必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象。 例:将一个复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式: Complex Complex∷operator+(int i) //重载函数是类的成员函数 { return Complex(real+i,imag); } 这时可以计算 c2=c1+i; 数学运算的交换定律不一定适合! 如果希望适用交换律,则应写出相应重载函数 课堂练习 设计一个三角形类Triangle,包含三角形三条边的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。想一想,如何设计重载运算符“+”,使之能计算任意多个三角形的面积之和? 分析运算符重载 重载后的运算符,可以通过下列方式使用: 显式成员函数调用(或调用友元函数) 运算符表达式 通过对复数重载“+”运算符测试: c1+c2 (两个复数相加)实际调用哪一个成员函数? c3=c1+c2 中,c3 如何构造?调用哪一个构造函数? 例5: #include iostream.h class Co
文档评论(0)