第9章 运算符重载
更新时间:2023-09-03 17:42:01 阅读量: 教育文库 文档下载
- 第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; }
void main() { complex c1(3,4),c2(4,3); bool b; b=c1!=c2; 程序运行结果为: c1.display(); (3+4*i ) != (4+3*i ) is True cout<<" != "; c2.display(); b?cout<<" is True."<<endl:cout<<" is False."<<endl;; cout<<endl; } 注意:当运算符重载为类的成员函数时,函数的参数个数比原来的 操作数个数要少一个(后置“++”、“--”除外);当重载为类的友元函数时, 参数个数与原操作数的个数相同。原因是重载为类的成员函数时,如果 某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要 再放在参数表中进行传递,缺少的操作数就是该对象本身。
9.4 几个常用运算符的重载9.4.1 单目运算符重载 9.4.2 双目运算符重载
return
9.4.1 单目运算符重载单目运算符只有一个操作数。例如:增量运算符++、减量运算符--和 单目负运算符(-)。增量运算符和减量运算符可以用于前缀或后缀运算。 1.重载为类的成员函数 【例9.4】重载运算符++。 #include "iostream.h" class Point { private: int xcoord; int ycoord; public: Point (){xcoord =0; ycoord =0;} void operator++(){ ++xcoord; ++ ycoord;} };
正在阅读:
第9章 运算符重载09-03
苏醒作文450字06-21
上外综合教程4 Unit 13电子教案10-05
第四章模糊数学(管理数学基础)06-03
环境保护监督牌11-16
5 价值工程习题库02-26
大体积筏板砼施工方案04-23
关于南京大屠杀的社会实践调查报告04-06
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 运算符
- 重载
- 高中数学必修三课时作业:第一章 章末检测 Word版含答案
- 深圳调干入户计划生育调查表(2013版)
- 超右脑快速英语单词形象记忆法(小学英语213个单词右脑记忆)
- 临床药学知识汇总(精华版)
- 数模转换电路设计与实验
- 优秀教师名师事迹材料
- (江苏专版)18年高考英语二轮复习增分篇专题巧突破专题三阅读理解专题限时检测(十六)阅读理解细节理解
- 职业高级中学建设项目立项可行性报告项目可行性研究分析报告
- 《教育科研方法试题》考试试卷
- 常见易误用成语
- 城市规划要以人为本
- 甲子中学教师信息化培训计划方案(定稿2)
- 读书笔记封面 (1)
- 电机学II课后习题答案
- 欧洲音乐史复习资料
- 小学美术人美版四年级上册第6课《有趣的字母牌》比赛获奖教案优质课公开课优秀教案
- 毛细管电泳法
- matlab命令数学建模上机实验
- 北京科技大学大学物理c3 2013年试卷
- 分团委学生会考核细则