c++第11章运算符重载课件

上传人:繁星 文档编号:88247728 上传时间:2019-04-22 格式:PPT 页数:85 大小:413KB
返回 下载 相关 举报
c++第11章运算符重载课件_第1页
第1页 / 共85页
c++第11章运算符重载课件_第2页
第2页 / 共85页
c++第11章运算符重载课件_第3页
第3页 / 共85页
c++第11章运算符重载课件_第4页
第4页 / 共85页
c++第11章运算符重载课件_第5页
第5页 / 共85页
点击查看更多>>
资源描述

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

1、第11章 运算符重载:字符串和数组对象,简介 用普通函数重载 用友员函数重载 用成员函数重载 典型的运算符重载 输入输出重载 实例研究:array类 实例研究:string类,运算符重载,使得系统的内置运算符适用于类的对象之间的操作。提高程序的可读性。,问题的提出,希望某些运算符能够对整个对象进行操作,而不是C中的简单操作. 例如:+ 运算符能够实现2个对象间的加。 类A的对象a1、a2、a3,希望: a3 = a1 + a2; 即:分别把对象a1和a2的各个数据成员值对应相加,然后赋给对象a3。,问题的提出,把某些事交给系统去做,用户只要知道相加就可 提出运算符重载,扩充运算符的功能。即:对

2、运算符进行重载定义,然后使用,由系统自动判断究竟采用哪一个具体的运算符。 增强了C+ 语言的可扩充性。,运算符重载的限制,不是所有的运算符都能重载 重载不能改变运算符的优先级和结合性 重载不能改变运算符的操作数个数 不能创建新的运算符 不能改变用于内部类型对象时的含义 用于用户自定义类型对象,或者和内部类型的对象混合使用,可以重载的运算符,+ - * / % & | ! = += -= *= /= %= = &= |= = = & | + - -* , - () new delete new delete,. .* : ?: sizeof,不能重载的运算符:,运算符重载的实现方法,用普通函数实

3、现 用成员函数实现 用友元函数实现,第11章 运算符重载:字符串和数组对象,简介 用普通函数重载 用友员函数重载 用成员函数重载 典型的运算符重载 输入输出重载 实例研究:array类 实例研究:string类,用普通函数实现运算符重载,创建运算符函数 运算符函数名为: operator后接一个要重载的运算符。 如:要重载“+”运算,函数名为 operator+。 重载“-”运算,函数名为 operator-。 参数表为要参加运算的对象,返回值为运算结果,运算符重载函数实例,#include class complexpublic: int r, i; complex(int rr=0, in

4、t ii=0) i=ii;r=rr; complex operator+(complex a1, complex a2) complex t; t.r = a1.r + a2.r; t.I = a1.i + a2.i; return t; void main() complex a1(1, 2), a2(3, 4), b; b = a1 + a2; cout b.r b.i; ,重载成普通函数的缺陷,运算符重载通常要对类的私有数据成员作操作。如果用普通函数重载,则需要通过公有的方法访问私有的数据成员,运算速度较慢,或将所有的数据成员都设为公有,直接访问这些数据成员,这样将违反类的封装。,第11

5、章 运算符重载:字符串和数组对象,简介 用普通函数重载 用友员函数重载 用成员函数重载 典型的运算符重载 输入输出重载 实例研究:array类 实例研究:string类,友元运算符函数,把运算符函数定义成某个类的友元函数,称为友元运算符函数。 友元函数在类内部的声明 friend type operator(参数表); 友元函数的定义:与一般函数相同 type operator(参数表) /函数体,双目运算符重载,友元运算符函数必须有两个参数 例:二元加操作符重载为友元函数 #include class A int x, y; public: A(int xx, int yy): x(xx),

6、 y(yy) A()x = 0; y = 0; friend A operator+(const A ,x=11 y=121,单目运算符重载,友元运算符有一个参数 例:一元减操作符重载为友元函数 #include class A int x, y; public: A(int xx, int yy): x(xx), y(yy) A()x = 0; y = 0; friend A operator-(const A ,x=-5 y=-55,第11章 运算符重载:字符串和数组对象,简介 用普通函数重载 用友员函数重载 用成员函数重载 典型的运算符重载 输入输出重载 实例研究:array类 实例研究

7、:string类,成员运算符函数,运算符重载通常作用在一个类上,因此可定义为类的成员函数或友元函数。 成员运算符函数的声明 class X/ type operator(参数表) / 成员运算符函数的定义 type X:operator(参数表) /函数体 ,双目运算符重载,成员运算符只需要一个参数,作为运算符的右操作数,当前对象作为左操作数。 例1:二元加操作符重载为成员函数。 #include class A int x, y; public: A(int xx, int yy): x(xx), y(yy) A()x = 0; y = 0; A operator+(A b) A tmp;

8、tmp.x = x + b.x; tmp.y = y + b.y; return tmp; void show() cout“x=“x“ y=“yendl; ; void main() A a1(5, 55), a2(6, 66), a3; a3=a1+a2; /a3=a1.operator+(a2); a3.show(); ,x=11 y=121,单目运算符重载,成员运算符无参数 例:一元减操作符重载为成员函数 #include class A int x, y; public: A(int xx, int yy): x(xx), y(yy) A() x = 0; y = 0; A oper

9、ator-( ) return A(-x, -y); void show() cout“x=“x“ y=“yendl; ; void main() A a1(5, 55); a1 = -a1; /调用操作符重载函数: a1=a1.operator -() a1.show(); /*执行结果: x=-5 y=-55 */,成员运算符函数与友元运算符函数的比较,成员运算符函数比友元运算符函数少一个参数。 除 =、()、- 这4种操作符必须重载成成员函数外,其他操作符重载成友元函数较好。 例,a是类A的一个对象,对于表达式:27.5 + a 对友元函数不存在问题: operator+(A(27.5)

10、,a) 但是,对成员函数存在问题: (27.5).operator+(a) /非法:27.5不是一个对象,无this指针。,成员运算符函数与友元运算符函数的比较 cont.,成员运算符函数和友元运算符函数都可用习惯方式调用,也可用专用方式调用。,第11章 运算符重载:字符串和数组对象,简介 用普通函数重载 用友员函数重载 用成员函数重载 典型的运算符重载 输入输出重载 实例研究:array类 实例研究:string类,典型的运算符重载,+和-的重载 =的重载 类型转换,“+”和“-”重载,、- -:是一元操作符 但是,可以是前缀或后缀。所以,重载时有所不同。 区分方法: 前缀:一元操作符。 后

11、缀:二元操作符。,“+”和“-”重载 cont.,成员函数重载 +ob重载为:ob.operator+( ) ob- 重载为:ob.operator-(int) 友元函数重载 +ob重载为:operator+(X &ob) ob-重载为:operator-(X &ob, int) 调用时,参数int一般传递给值0。,+和-操作符重载成成员函数,#include class Counter unsigned value; public: Counter(int v=0) value=v; Counter operator+() value+; cout“1. “value“ “; return

12、*this; Counter operator+(int) Counter t; cout“2. “value“ “; t.value=value+; return t; void display() coutvalueendl; ; void main() Counter a(11),b(22),c; +a; /自动调用 operator+() a.display(); c=b+; /自动调用operator+(int) b.display(); c.display(); ,1. 12 12 2. 22 23 22 */,+和-操作符重载成友元函数,#include class Counte

13、r unsigned value; public: Counter(int v=0) value=v; friend Counter operator+(Counter ,1. 12 12 2. 22 23 22 */,运算符重载实例,试设计一个类,用来表示大于 long int 的数字 设想:用一个由数字组成的字符串来表示数据。如允许的最大长度为128位,则字符数组的长度为128。如数字123,可表示为,类的定义,class longlong char s128; public:longlong(const char *s1); longlong(); friend longlong ope

14、rator+(const longlong ,构造函数定义,longlong(const char *s1) int i= strlen(s1) - 1, j = 0; while (i=0) if (s1i 9 | s1i 0) cout “set error“; i=-1; else sj=s1i; -i; +j; for (; j 128; +j) sj=0; longlong() for (int i=0; i128; +i) si = 0;,加法运算定义,longlong operator+(const longlong ,加法运算定义,longlong operator+(cons

15、t longlong ,显示函数定义,void show() int i=127; while (si=0) -i; /去掉高位0 while (i=0) coutsi;-i; coutendl;,测试程序,void main() longlong a(“123“), b(“345“), c; c = a + b; c.show(); c = a + 5; c.show(); ,648 128,典型的运算符重载,+和-的重载 =的重载 类型转换,赋值运算符“=”的重载,对任一类,如果用户没有自定义赋值运算符函数,那么系统为其生成一个缺省的赋值运算符函数,在对应成员间赋值。 X &X:operator=(const X &source) / 成员间对应赋值 一旦创建了对象x1, x2, 可以用 x1 = x2赋值。,赋值运算符“=”的重载,有时,使用缺

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

当前位置:首页 > 办公文档 > 工作范文

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