第9章 运算符重载
第9章 运算符重载9.1 9.2 9.3 9.4 概述 运算符重载的一般规则 运算符重载的两种形式 几个常用运算符的重载
over
9.1 概述运算符重载就是编写函数来拓展某些运算符所作用的对象范围,使得它们不但能用于标准的数据类型,而且能 应用于用户自定义类的对象或者对象与标准数据类型的混
合操作。这一类函数成为运算符重载函数,对这一类函数的重载称为运算符重载。 为什么要重载运算符?运算符重载能带来哪些好处 呢?让我们分析下面的程序。
int sum_i; float sum_f , sum; int i1 = 123 , i2 = 456; float f1 = 3.45 , f2 = 6.78; sum_i = i1 + i2; sum_f = f1 + f2; sum = i1 + f1; 在上面的程序中,为什么同一个运算符“+”可以完成不同类 型的数据的加法运算呢?原因在于C++语言针对基本数据类型已 经对某些运算符做了运算符重载。 当编译程序编译表达式i1+i2时,会自动使用整型数据相加的 算法,编译表达式f1+f2时会自动使用浮点数相加的算法,依次 类推。上述工作都是由编译程序自动完成的,无需程序员进行 任何操作。
但是C++语言在解决各种各样的实际问题时往往需要使用许多自定义的数 据类型。例如,在解决科学计算问题时常要用到复数的运算,下面定义一个简 化的复数类complex: class complex { double real,imag; complex(double r=0,double i=0) { real = r ; imag = i ; } }; 然后定义类complex的两个对象c1和c2,再把c1和c2加在一起,这样的运 算能不能实现呢?答案是否定的。例如: void main() { complex c1(1.1,2.2) , c2(3.3,4.4) , total ; total = c1+c2; //编译错误 …… }
【例9.1】使用成员函数完成复数的加法运算。 #include <iostream.h> class complex // complex类声明 { private: double x,y; //实部为x,虚部为y public: complex(double xx=0,double yy=0) //构造函数 { x=xx; y=yy; } double getx() //得到实部x值 { return x; } double gety() //得到虚部y值 { return y; }
void display() //输出复数 { cout<<"( "<<x; if(y>0) cout<<" + "<<y<<"*i )"; else if(y<0) cout<<y<<"*i )"; else cout<<" )"; } complex add(complex &c1, complex &c2) //定义成员函数实现复数加法运算 { this->x=c1.x+c2.x; this->y=c1.y+c2.y; return *this; }}; void main() { complex c1(3,4),c2(4,-5),c3; c3.add(c1,c2); c1.display(); cout<<" + "; c2.display(); cout<<" = "; c3.display(); cout <<endl; }
程序运行结果: (3+4*i)+(4-5*i)=(7-1*i)
9.2 运算符重载的一般规则运算符重载的一般规则如下: ⑴重载的运算符是C++中已经存在的运算符,不允许用户自己定义新的运 算符。 ⑵运算符重载不能改变运算符的语法结构,即操作数的个数。例如:增 量运算符++和减量运算符--只能重载为单目运算符使用。不能重载为双目 运算符使用。 ⑶运算符重载不能改变C++语言中已
定义的运算符的优先顺序和结合性。 ⑷运算符重载一般不改变运算符功能。 ⑸不能重载的运算符有:sizeof()运算符;成员运算符(.);指向成员的指 针运算符(*);作用域运算符(::);条件运算符(?:)。 ⑹重载的运算符必须和用户自定义的类对象一起使用,其参数至少应有 一个是类的对象或对象的引用。 ⑺重载运算符函数不能含有默认的参数。 ⑻运算符只能被显式重载。return
9.3 运算符重载的两种形式9.3.1 用成员函数重载运算符 9.3.2 用友元函数重载运算符
return
9.3.1 用成员函数重载运算符运算符重载为类的成员函数的语法格式如下: 函数类型 类名::operator 运算符(参数表) { 函数体; } 其中,“函数类型”是成员函数的返回值类型;“类名”是重 载该运 算符 的类;“operator”是关键字,是重载运算符标志;“运算符” 是 要重载的运算符;“参数表”表示该运算符所需要的操作数,二元 运 算符重载为类的成员函数,它们包含一个形参,即运算符右侧的操 作数。 注意:要重载的运算符必须置于关键字operator之后。
【例9.2】用成员函数重载算术运算符“+”。 #include <iostream.h> class complex { private: double x,y; public: complex(double xx=0,double yy=0) { x=xx; y=yy; } double getx() { return x; }
// complex类声明
//实部为x,虚部为y
//构造函数
//得到实部x值
double gety() { return y; } void display() { cout<<"( "<<x; if(y>0) cout<<" + "<<y<<"*i )"; else if(y<0) cout<<y<<"*i )"; else cout<<" )"; } complex operator +(complex &c1); };
//得到虚部y值
//输出复数
//声明重载算术运算符“+”
complex complex::operator +(complex &c1) //定义重载算术运算符函数 { complex c; c.x=this->x+c1.x; c.y=this->y+c1.y; return c; } void main() { complex c1(3,4),c2(4,-5),c3; c3=c1+c2; //使用重载的运算符“+” c1.display(); cout<<" + "; 程序运行结果: c2.display(); ( 3+4*i ) + ( 4-5*i ) = ( 7-1*i ) cout<<" = "; c3.display(); cout <<endl; }
现在可以使用以下语句将对象进行加操作: obj3 = obj1 + obj2; // 类complex 对象
运算符“+”可以访问两个对象:运算符左侧对象obj1是将要调用重载运算符函数的对象,右侧对象obj2作为函数调用的参数,也就是说 编译程序将其解释为obj3 = obj1.operator+(obj2)的形式。因为它是 调用函数的对象,所以可直接访问左侧操作数(即对象obj1),把右 侧操作数作为参数来访问。 由此可见,当重载为成员函数时,双目运算符仅有一个参数。对 于单目运算符,重载为成员函数时,不需要再说明参数。重载为成员
函数时,总是隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。
return
9.3.2 用友元函数重载运算符运算符重载为类的友
元函数的一般语法形式如下: friend 函数类型 operator 运算符 (形参表) {
函数体;} 其中:“friend”是运算符重载为友元函数时,在函数 类 型说明之前使用的关键字。 二元运算符重载作为友元函数,它们含有两个参数。
【例9.3】用友元函数重载关系运算符"!="。 #include <iostream.h> class complex // complex类声明 { private: double x,y; //实部为x,虚部为y public: complex(double xx=0,double yy=0) //构造函数 { x=xx; y=yy; } double getx() //得到实部x值 { return x; }
double gety() //得到虚部y值 { return y; } void display() { cout<<"("<<x; if(y>0) cout<<"+"<<y<<"*i )"; else if(y<0) cout<<y<<"*i )"; else cout<<endl; } friend bool operator !=(complex &c1,complex &c2); }; bool operator != (complex &c1,complex &c2) { bool c; c =(c1.x!=c2.x)||(c1.y!=c2.y); return c; }
…… 此处隐藏:2234字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [综合文档]应答器设备技术规范(征求意见稿)A1
- [综合文档]教师 2012年高考政治试题按考点分类汇
- [综合文档]保险公司的总经理助理竞职演说
- [综合文档]卫生应急大练兵大比武活动考试--题库(
- [综合文档]徐州经济技术开发区总体规划环境影响报
- [综合文档]汉语拼音表(带声调)
- [综合文档]二年级 上 思维训练( 1~18)
- [综合文档]特色学校五年发展规划
- [综合文档]机床经常出现报警“X1轴定位监控”
- [综合文档]《电子技术基础》21.§5—2、3、4 习题
- [综合文档]浙江省深化普通高中课程改革
- [综合文档]CRISP原理 - 图文
- [综合文档]2017年电大社会调查研究与方法形考答案
- [综合文档]浅析建筑施工安全毕业论文
- [综合文档]《回忆我的母亲》名师教案
- [综合文档]装饰装修工程监理规划
- [综合文档]三下乡心得体会-文艺
- [综合文档]柱计算长度系数 - 图文
- [综合文档]全流程思考,提高燃电系统热电转换率--
- [综合文档]2018年嘉定区中考物理一模含答案
- 433M车库门滚动码遥控器
- 8、架空线路施工规范
- 大学四年声乐学习的体会
- 新北师大版五年级数学上册《轴对称再认
- 部编版五年级上册语文第六单元小结复习
- 小学六年级英语形容词用法
- 第2课 抗美援朝保家卫国 课件01(岳麓版
- 2015年天津大学运筹学基础考研真题,考
- 微机计算机控制技术课后于海生(第2版)
- 安全教育实践活动
- Delphi程序设计教程_第1章_Delphi概述
- 第八讲 工业革命与启蒙运动
- 《中华人民共和国药典》2005年版二部勘
- 科粤版九年级化学2.3构成物质的微粒(1)
- 西师大版数学三年级下册《长方形、正方
- ch6_冒泡排序演示
- 第4章 冲裁模具设计
- 浙江中小民营企业员工流失论文[终稿]
- 再议有线数字电视市场营运模式
- 昆明供水工程监理大纲




