版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第4章章 运算符重载运算符重载 C+语言程序设计教程语言程序设计教程大连理工大学软件学院大连理工大学软件学院第第4章章 运算符重载运算符重载 大连理工大学软件学院大连理工大学软件学院4.5 字符串类实例字符串类实例4.4 常用运算符重载常用运算符重载4.3 运算符重载方法运算符重载方法4.2 运算符重载规则运算符重载规则4.1 理解运算符重载理解运算符重载v 使用运算符对各种数据进行操作,高效快捷且清晰易懂。使用运算符对各种数据进行操作,高效快捷且清晰易懂。 如果运算符也能作用于各种类对象,会使代码简洁而优雅。如果运算符也能作用于各种类对象,会使代码简洁而优雅。v1 = v1+ v2 ; /
2、向量加法向量加法M1 = M1+ M2 ; /矩阵相加矩阵相加v1 = M1*v2 ; / 向量与矩阵相乘向量与矩阵相乘m1 = v1*v2 ; / 向量相乘向量相乘int day = d1- d2 ; / 计算日期差计算日期差double d = p1 p2 ;/ 计算两点距离计算两点距离4.1 4.1 理解运算符重载理解运算符重载第第4章章 运算符重载运算符重载 class Complex public:Complex(double r=0, double i=0) dReal=r; dImag=i; Complex complexAdd(Complex &c2) ; private:do
3、uble dReal, dImag; ;Complex Complex : complexAdd(Complex &c2) Complex c; c.dReal = dReal+c2.dReal;c.dImag = dImag+c2.dImag;return c; c = c1. c = c1. complexAdd( ( c2 ); c2 ); 第第4章章 运算符重载运算符重载 class Complex public:Complex(double r, double i) dReal=r; dImag=i; Complex operator + (Complex &c2); private
4、:double dReal, dImag; ;Complex Complex:operator + (Complex &c2)Complex c; c.dReal = dReal+c2.dReal;c.dImag = dImag+c2.dImag;return c;/ return Complex ( dReal+c2.dReal, dImag+c2.dImag); c = c1 + c2; / c1.operator+(c2) c = c1 + c2; / c1.operator+(c2)第第4章章 运算符重载运算符重载 重载运算符函数可以对运算符作出新的解释,重载运算符函数可以对运算符作出
5、新的解释, 原有基本语义不变:原有基本语义不变:不能创建新的运算符不能创建新的运算符不能改变运算符的优先级和结合性不能改变运算符的优先级和结合性不能改变运算符所需要的操作数不能改变运算符所需要的操作数不能改变该运算符用于基本类型变量时的含义不能改变该运算符用于基本类型变量时的含义第第4章章 运算符重载运算符重载 4.2 4.2 运算符重载规则运算符重载规则可以重载大部分已有的运算符可以重载大部分已有的运算符 特殊的运算符不允许被重载特殊的运算符不允许被重载 .: .*( .-.-)? :sizeof #第第4章章 运算符重载运算符重载 4.2 4.2 运算符重载规则运算符重载规则&大连理工大学
6、软件学院大连理工大学软件学院第第4章章 运算符重载运算符重载 3 普通函数普通函数1成员函数2友元函数友元函数重载方法 成员函数的语法形式成员函数的语法形式 类型类型 类名类名 : operator op ( 参数表参数表 ) / 相对于该类定义的操作相对于该类定义的操作函数返回类型函数返回类型由由op构成的表达构成的表达式的类型决定式的类型决定 重载该运算符的类重载该运算符的类 函数名函数名关键字关键字被重载的运算符被重载的运算符 4.3 4.3 运算符重载方法运算符重载方法第第4章章 运算符重载运算符重载 成员函数重载算符成员函数重载算符第第4章章 运算符重载运算符重载 class Com
7、plex double dReal, dImag; public:Complex(double r=0, double i=0);Complex operator + (Complex &c2);Complex operator + (double d); ; Complex z ( 2.0 , 3 ) , k ( 3 , 4.5 ) ; z = z k; k = z + 27 ; k = 27 + z ; z . operator + ( k )z . operator + ( 27 )?Complex operator + ( int a ,Complex &c2) Complex c;
8、c.dReal = a+c2.dReal;c.dImag = 0+c2.dImag;return c; k=operator + (27, z )k = 27 + z ;k = 27 + z ;第第4章章 运算符重载运算符重载 友元函数重载算符友元函数重载算符何时用成员函数重载算符?何时用成员函数重载算符? 当一元运算符的操作数,或者二元运算符的左操作数当一元运算符的操作数,或者二元运算符的左操作数 是该类的一个对象时,重载运算符函数为成员函数是该类的一个对象时,重载运算符函数为成员函数 class Complex double dReal, dImag; public:Complex(dou
9、ble r, double i);Complex operator + (Complex &c2);Complex operator - ( );Complex operator * (double d); ; 第第4章章 运算符重载运算符重载 第第4章章 运算符重载运算符重载 class Complex double dReal, dImag; public:Complex(double r, double i);Complex operator + (Complex &c2);Complex operator + (double d);; ; Complex z ( 2.0 , 3 ) ,
10、 k ( 3 , 4.5 ) ; k = z + 27 ; k = 27 + z ; 成员函数重载的成员函数重载的“ + ”算算符符不支持交换律不支持交换律何时成员函数不能重载算符?何时成员函数不能重载算符?第第4章章 运算符重载运算符重载 友元函数重载运算符常用于运算符的左右操作数类型友元函数重载运算符常用于运算符的左右操作数类型不同的情况。不同的情况。 友元函数重载运算符友元函数重载运算符普通普通函数函数友元友元函数函数重载重载运算符运算符 Complex operator+(double d1, const Complex &c2);friend Complex operator+( d
11、ouble d1, const Complex &c2); 练习与思考练习与思考u代码练习代码练习定义定义ComplexComplex类类1.1.重载重载operator-operator-进行两个复数间的减法操作进行两个复数间的减法操作2.2.重载重载operator-operator-进行复数和实数的减法操作进行复数和实数的减法操作3.3.重载重载operator-operator-进行复数取反操作(单目)进行复数取反操作(单目)参见例参见例ch4.2 思考思考 实现运算符重载时实现运算符重载时 友员函数友员函数 vs.vs.成员函数成员函数 1优先选择成员函数实现运算符重载优先选择成员函
12、数实现运算符重载 一般情况下单目运算符重载为类的成员函数,尤其运算符的操作需要修改对象的状态时。双目运算符可以重载为类的成员或者友元函数。不能用类的友元函数重载实现的运算符 成员函数与友元函数的比较成员函数与友元函数的比较第第4章章 运算符重载运算符重载 =()() -2不能重载为成员函数的运算符不能重载为成员函数的运算符当有两个不同类型的对象进行混合运算时,若双目运算符的左当有两个不同类型的对象进行混合运算时,若双目运算符的左操作数不是操作数不是A类对象,而右操作数为类对象,而右操作数为A类对象,则该运算符函类对象,则该运算符函数不能重载为数不能重载为A类成员函数。类成员函数。当运算符函数重
13、载为某类的成员函数时,双目运算符的左操作当运算符函数重载为某类的成员函数时,双目运算符的左操作数,或者单目运算符的唯一操作数,必须是该类的对象或者对数,或者单目运算符的唯一操作数,必须是该类的对象或者对象的引用。象的引用。 成员函数与友元函数的比较成员函数与友元函数的比较第第4章章 运算符重载运算符重载 关系运算符关系运算符 、 = 、= 自增自减运算符自增自减运算符 +、- 赋值运算符赋值运算符 = 下标运算符下标运算符 流操作运算符流操作运算符 第第4章章 运算符重载运算符重载 class Box /盒子类盒子类public: Box(double l=1.0, double w=1.0,
14、 double h=1.0) ; double volume( ) const; /计算盒子体积计算盒子体积 private: double length; double width; double height;第第4章章 运算符重载运算符重载 4.4.1重载关系运算符重载关系运算符课堂练习课堂练习对对Box类进行运算符重载:类进行运算符重载:v成员函数重载成员函数重载 bool operator(Box &)v成员函数重载成员函数重载= bool operator=(Box &)v友元函数重载友元函数重载 比较实数比较实数d与盒子与盒子Box b的体积大小的体积大小 参见例参见例ch4.3
15、4.4.2 重载自增运算符重载自增运算符 +; +;第第4章章 运算符重载运算符重载 1如 何 使 编译器能区分前置自增和后置自增运算符;2如何设计重载函数的类型,即返回什么对象重载重载+ 难点难点4.4.2 重载自增运算符重载自增运算符v 重载自增运算符的语法格式:重载自增运算符的语法格式:前缀运算前缀运算 operator +();(); 后缀运算后缀运算 operator+(int);); 第第4章章 运算符重载运算符重载 伪参数伪参数 class Increase int value;public : Increase (int v=0 ) value= v; void operato
16、r + ( ); /重载前置重载前置+ void operator + ( int ); /重载后置重载后置+; 例例 重载自增运算符重载自增运算符Increase I1(1), I2 ; + I1; I2 = I1 +; I1.operator+();I1.operator+(0); class Increase int value;public : Increase (int v=0 ) value= v; Increase operator + ( ); /重载前置重载前置+ Increase operator + ( int ); /重载后置重载后置+; 例例 重载自增运算符重载自增运
17、算符Increase I1(1), I2 ; +I1; I2 = +I1; I2 = + + I1;/I1结果如何结果如何 Increase Increase : operator + ( ) +value ;return *this; 调用复制构造调用复制构造返回对象?返回对象? class Increase int value;public : Increase (int v=0 ) value= v; Increase operator + ( ); /重载前置重载前置+ Increase operator + ( int ); /重载后置重载后置+; 例例 重载自增运算符重载自增运算符
18、Increase I1(1), I2 ; I1 +; I2 = I1 +; Increase Increase : operator + (int) Increase temp;temp.value = value +; return temp; 返回局部对象返回局部对象 void main( ) Increase a , b , n ; for ( int i = 0 ; i 10 ; i + ) a = n + ; cout n= ; n.display( ) ; cout a= ; a.display( ) ; for ( int i = 0 ; i 10 ; i + ) b = + n
19、 ; cout n= ; n.display( ) ; cout b= ; b.display( ) ; 重载自增运算符重载自增运算符cout “n=”nendl;设设A Aobject ; +Aobject; / A对象自增对象自增 成员函数成员函数重载重载 友元函数友元函数重载重载 6.3.1 重载重载+与与-第第4章章 运算符重载运算符重载 4.4.2 重载自增运算符重载自增运算符A : A operator+ () ; Aobject . operator +( ) ;解释为解释为friend A operator+ (A &) ; operator +( Aobject ) ;解释为
20、解释为友员函数重载友员函数重载+class Increaseint value ;public : Increase ( ) value=0; void display( ) const coutvaluen; ;friend Increase& operator + ( Increase & ) ; / 前置前置friend Increase& operator + ( Increase &, int ) ; ;Increase& operator + ( Increase & a ) a.value + ; return a ; Increase& operator + ( Increas
21、e & a, int ) Increase temp(a); a.value + ; return temp; 6.3.1 重载重载+与与-第第4章章 运算符重载运算符重载 通过引用参数通过引用参数操作对象操作对象?4.4.3 特殊运算符的重载特殊运算符的重载class IntArraypublic:IntArray(int s=0); IntArray(); /其他成员函数其他成员函数private:int * pArr; /数组首地址数组首地址int size; /数组大小数组大小;第第4章章 运算符重载运算符重载 使用数组的局限性使用数组的局限性int i=3, a3, bi; cout
22、 b ; a = b ; a3 = b3;重载下标运算符重载下标运算符 运算符运算符 是二元运算符是二元运算符, ,下标运算符下标运算符“ ” ”通常用通常用于在数组中标识数组元素的位置,下标运算符重载可以于在数组中标识数组元素的位置,下标运算符重载可以实现数组数据的赋值和取值实现数组数据的赋值和取值. .只能用成员函数重载,不能用友元函数重载只能用成员函数重载,不能用友元函数重载 下标运算符函数重载的一般形式为:下标运算符函数重载的一般形式为: 返回类型返回类型 类名类名 : operator ( int index ) ;: operator ( int index ) ;6.3.3 重载
23、运算符重载运算符和和()第第4章章 运算符重载运算符重载 返回数组元素的引用返回数组元素的引用元素下标元素下标第第4章章 运算符重载运算符重载重载下标运算符重载下标运算符 class IntArraypublic: IntArray(int s=0); IntArray(); int& operator(int i);private: int * pArr; int size;int& IntArray:operator(int i) if(isize) cout Out of range!endl; return pArr0; return pArri; IntArray a(3),b(5)
24、; for( int i = 1 ; i=5;i+) bi = i; for( i = 1 ; i=5; i+) cout ai ; cout a bendl; istream 和和 ostream 是是 C+ 的预定义流类的预定义流类 cin 是是 istream 的对象,的对象,cout 是是 ostream 的对象的对象 运算符运算符 由由 istream 重载为提取操作,重载为提取操作, 用于输出于输入基本类型数据用于输出于输入基本类型数据; 重载重载 输出和输入用户自定义的数据类型输出和输入用户自定义的数据类型 .重载流插入和流提取运算符重载流插入和流提取运算符 第第4章章 运算符重
25、载运算符重载 重载函数形式 : istream & operator (istream &, 自定义类 &);ostream & operator ”和“”的函数作为友元函数或普通的函数。重载流插入和流提取运算符重载流插入和流提取运算符 第第4章章 运算符重载运算符重载第第4章章 运算符重载运算符重载重载运算符重载运算符class IntArraypublic: IntArray(int s=0); IntArray(); int& operator(int i);friend ostream& operator ( ostream& out, intArray&a) ;private: in
26、t * pArr; int size;ostream& operator(ostream& out, IntArray& a) for(int i = 1 ; i=a.size ; i+) out a.pArri ; return out;cout 的别名的别名 IntArray a(3),b(5); for( int i = 1 ; i=5;i+) bi = i; for( i = 1 ; i=5; i+) cout ai ; cout a bendl; 第第4章章 运算符重载运算符重载class IntArray int * pArr; int size;public: IntArray(
27、int s=0); IntArray(); int& operator(int i);friend ostream& operator ( ostream&, intArray&) ; IntArray a(3),b(5); for( int i = 1 ; i=5;i+) bi = i; a = b; cout a bendl; =可以不必重载可以不必重载运行错误运行错误v复制构造复制构造 v 赋值运算赋值运算第第4章章 运算符重载运算符重载 IntArray a(5), b(a); IntArray a(5),b(3); b = a; (a)赋值操作前 (b)赋值操作后第第4章章 运算符重
28、载运算符重载IntArray:IntArray(int s) size = s; if(size = 0) /空数组空数组 pArr = NULL; else /分配空间,分配空间,0号元素不用号元素不用 pArr = new intsize+1; for(int i = 1; i= size;i+) pArri = 0; / 数组元素置数组元素置0 IntArray:IntArray( ) if(pArr!=NULL) delete pArr ; /释放数组空间释放数组空间 IntArray a(5); IntArray b= a; 深复制与浅复制深复制与浅复制v复制构造复制构造- 深复制与浅复制深复制与浅复制v 赋值运算赋值运算第第4章章 运算符重载运算符重载 IntArray a(5), b(a); IntArray a(5),b(3); b = a; (a)析构对象b (b) 析构对象av 赋值运算赋值运算第第4章章 运算符重载运算符重载 IntArray a(5), b(a); IntArray a(5),b(3); b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-山东-山东水文勘测工一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-宁夏-宁夏检验员二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-天津-天津水文勘测工四级(中级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-四川-四川水土保持工五级(初级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-吉林-吉林水工监测工四级(中级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-内蒙古-内蒙古检验员二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-上海-上海水利机械运行维护工三级(高级工)历年参考题库含答案详解3套试卷
- 月嫂培训考试试题及答案
- 2026年四川高考语文真题试卷及答案
- 成都天府实验北区2026初一入学语文分班考试真题含答案
- 工序流转卡管理制度
- 医疗质量管理和持续改进记录文本表
- 误伤私了协议书范本
- 护理风险防范管理制度
- 架空线路拆除施工组织设计方案
- 高考物理一轮复习课件开学第一课
- 《无损检测(第2版)》 课件第六章 声发射检测
- (高清版)DZT 0205-1999 地面γ能谱测量技术规程
- 工程冻土研究课件
- 母女三人闹元宵三人混战猜灯谜
- 胰腺癌的教学查房
评论
0/150
提交评论