面向对象程序设计语言c++第05章_运算符重载

上传人:mg****85 文档编号:49692411 上传时间:2018-08-01 格式:PPT 页数:79 大小:1.01MB
返回 下载 相关 举报
面向对象程序设计语言c++第05章_运算符重载_第1页
第1页 / 共79页
面向对象程序设计语言c++第05章_运算符重载_第2页
第2页 / 共79页
面向对象程序设计语言c++第05章_运算符重载_第3页
第3页 / 共79页
面向对象程序设计语言c++第05章_运算符重载_第4页
第4页 / 共79页
面向对象程序设计语言c++第05章_运算符重载_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《面向对象程序设计语言c++第05章_运算符重载》由会员分享,可在线阅读,更多相关《面向对象程序设计语言c++第05章_运算符重载(79页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计语言C+电子科技大学计算机学院1第五章 运算符重载当在使用一种程序设计语言编写程序时,我们 不仅要设计新的数据类型,同时还要为新类型设计 运算。一般地,用户定义类型的运算都是用函数的 方式实现的。而在一般情况下,一种类型的运算都是用运算符 表达的,这很直观,语义也简单。但是如果直接将运算符作用在用户定义类型之 上,那么编译器将不能识别运算符的语义。因此, 在这种情况下,我们需要一种特别的机制来重新定 义作用在用户定义类型上的普通运算符的含义。这 就是运算符重载的简单概念。2第五章 运算符重载其实在C编译器里早就存在简单的运算符重载 的概念了。考虑整型和浮点型两种加法运算:int

2、 a = 1, b; b = a + 2;float c = 1.0, d; d = c + 2.0;在上面的两条加法语句中,都用到了运算符 “+”。这符合我们数学常识。但对于C编译器来说 ,这两个加法却被翻译成不同的指令。这就是说, “+”运算符至少具有两种不同的解释(实现代码 )。此时我们说, “+”运算符被重载了。遗憾的 是,C仅支持很少量的运算符重载。3第五章运算符重载C+扩充了C运算符重载的功能,允许已存在的 预定义运算符在不同的上下文中做出不同的解释。当两个字符串类进行连接的时候,我们可能用 到这样的方式: class String public:String string_cat

3、(String); ; String str1, str2, str3; str3 = str1.string_cat(str2);4第五章运算符重载显然,这不如str3 = str1 + str2 简单明了。但问题是,C+编译器只知道+运算符是作用在 整型和浮点型数据之上的,它不知道在上述表达式 中+运算符的确切含义。因此,在设计类String时,我们必须增加“+”运算 符的含义。这样一来,语义变得更加清晰和易懂。5第五章 引论在原来预定义的运算符含义的基础上 ,再增加对于某个用户定义类型的对象 进行操作的新的含义。这就是运算符重 载。运算符重载后,其优先级和结合性 不变。6第五章 引论考虑

4、复数的加法运算: class Complex double re, im; public:Complex(double r, double im) re=r; im=i; Complex() re = 0.0; im = 0.0; Complex add_Complex(Complex c)Complex temp; temp.re = re + c.re; temp.im = im + c.im;return temp; ;7 /整个函数体也可简化为return Complex(re+c.re, im+c.im);第五章 引论void main( ) Complex obj1(1,2),ob

5、j2(3,4); Complex obj3=obj1.add_Complex(obj2); 能不能将2个复数相加表示为:obj1+obj2 呢?9第五章 引论5.1 重载运算符C+提供了一种将标准定义的运算符用在用户自 定义类型上的方法,称为运算符重载。C+约定,如果一个成员函数的函数名字是特殊 的,即由关键字operator加上一个运算符构成,如 operator+。obj1.operator+(obj2) 称为函数operator+()的显示 调用形式;obj1+obj2称为函数operator+()的隐式调用形式;函数operator+()称为运算符重载函数。10第五章 引论考虑复数的加

6、法运算: class Complex double re, im; public:Complex(double r, double im) re=r; im=i; Complex() re = 0.0; im = 0.0; Complex operator+ (Complex c)Complex temp; temp.re = re + c.re; temp.im = im + c.im;return temp; ;11第五章 引论5.1 重载运算符 void main( ) Complex obj1(1,2),obj2(3,4); Complex obj3=obj1.+obj2; obj1+

7、obj2 等价于:obj1.operator+(obj2)12第五章 引论5.1.1运算符重载的语法形式在C+中,运算符通过一个运算符重载函数进行重载。运 算符重载可以采用成员函数和友元函数两种重载方式,语法 形式如下: (1)运算符重载函数为成员函数的语法形式为:type Class_Name:operator(参数表) /相对于Class_Name类而定义的操作 其中,type是返回类型,“”是要重载的运算符符号, Class_Name是重载该运算符的类的类名,函数名 operator。13第五章 引论5.1.1运算符重载的语法形式 (2)运算符重载函数为友元函数的语法形式为:type o

8、perator(参数表)/相对于该类而定义的操作14第五章 引论5.1.2 重载运算符规则 (1) 只有少数的C+语言的运算符不能重载: :# ?:*15第五章 引论5.1.2 重载运算符规则 (2)只能对已有的C+运算符进行重载。 (3)重载运算符时,不能改变它们的优先级,不能改 变它们的结合性,也不能改变这些运算符所需操 作数的数目。 (4)重载运算符的函数不能有默认的参数,否则就改 变了运算符所需要的操作数的数目。16第五章 引论5.1.2 重载运算符规则(5)重载的运算符必须和用户自定义类型的对象一起 使用,其参数至少应用一个是类对象(或类对象 的引用)。 (6)用于类对象的运算符一般

9、必须重载,有两个运算 符:赋值运算符=和地址运算符 temp.re=-re; temp.im=-im; return temp; 第五章 引论5.1.3一元和二元运算符 (2)友元函数重载运算符type operator(Class_Name Cobj) 显式调用方式:operator(obj) 隐式调用方式: obj 或者 obj(例5-5/6)22友元函数Complex operator!(const Complex temp.re=-obj.re; temp.im=-obj.im; return temp; 第五章 引论5.1.3一元和二元运算符 2.二元运算符 (1)成员函数重载运算符

10、type Class_Name:operator(Class_Name Cobj) 显式调用方式: obj1.operator(obj2) 隐式调用方式: obj1 obj224第五章 引论5.1.3一元和二元运算符 (2)友元函数重载运算符type operator (Class_Name Cobj1,Class_Name Cobj2) 显式调用方式: operator (obj1,obj2) 隐式调用方式: obj1 obj2(例5-7/8)25成员函数Complex Complex :operator+(const Complex temp.re=re+obj.re;temp.im=im

11、+obj.im;return temp; 友元函数Complex operator+(const Complex temp.re=aobj.re+bobj.re;temp.im=aobj.im+bobj.im;return temp; 第五章 引论5.1.3一元和二元运算符 3运算符重载为成员函数和友元函数的选择建议28non-membernon-memberAll other binary All other binary operatorsoperatorsmembermember+= = /= *= = += = /= *= = 友元函数重载Class_Nam operator+(Cla

12、ss_Nam 29成员函数 Complex im+; return *this; Complex Complex:operator+(int) /后缀 Complex c(*this);/拷贝构造函数 re+; im+; return c; 第五章 引论 5.1 重载运算符 5.1.4 重载+和-的前缀和后缀方式 对于后缀方式obj+: 成员函数重载Class_Nam Class_Nam:operator+(int); 友元函数重载Class_Nam operator+(Class_Nam 这时,第二个参数(int)只是一个占位符号,用来区 分该重载函数是前缀方式还是后缀方式,在函数 内部不需

13、要也不能使用。通常用0表示。(例5-11/12)31有元函数 Complex obj.im+; return obj; Complex operator+(Complex /拷贝构造函数 obj.re+; obj.im+; return c;第五章 引论 5.1 重载运算符 5.1.5 重载赋值运算符 赋值运算符“=”可以被重载,用户可以定义自己需要的重载 “=”的运算符重载函数。重载了的运算符函数operator=不 能被继承,而且它必须被重载为成员函数,一般重载格式 为:X X:operator=(const X int size;public:Array(int num) size=(n

14、um6)?num:6;p=new intsize; Array( ) delete p; int ostream scout”的第一个操作数是cin,它 实际上是标准类类型istream的对象的引用( 它的定义在文件iostream中)。 若在程序中,用户自己定义 一个istream的 对象的引用,也可以直接使用运算符“”。第五章 引论5.1.7重载输入和输出运算符对于类类型,用户可以重载运算符“”和“也有类似的情况,但要注意第二个参数必须 是对象的引用 。(例5-16)45class Complex double re,im; public: friend ostream ; ostream

15、 return is; void main( ) Complex obj1,obj2;coutobj1obj2; coutsize; cp=new Complexsize; 49第五章 引论5.2.3 指针悬挂问题 指针悬挂就是指:使用new申请的存储空间无法访 问,也无法释放。 造成指针悬挂原因是对指向new申请的存储空间的 指针变量进行赋值修改。 char * p,* q; p=new char10; q=new char10; strcpy(p, “abcd“); q=p; delete p; delete q; /错误,同样的空间被释放两次50 对象的拷贝有两种方式:初始化和赋值。将一个对象的数据成员对应地赋值给另一个对象的 数据成员; 如果一个类包含有指针类型的数据成员,那么,该 类的对象的拷贝(初始化和赋值)就可能会有问题。对象的指针成员直接赋值,就可能导致指针悬挂。 需要重新定义拷贝构造函数和超载“=”的函数class String char * pstr;int sz;public:String (int s) pstr=new char sz=s; String ( ) delete pstr;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

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