程序设计实习 运算符重载.ppt_第1页
程序设计实习 运算符重载.ppt_第2页
程序设计实习 运算符重载.ppt_第3页
程序设计实习 运算符重载.ppt_第4页
程序设计实习 运算符重载.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计实习运算符重载,2,回顾:类和对象,类的定义、成员属性、成员函数、类的作用域对象的创建、存储、访问构造函数、析构函数定义、调用时机特殊的构造函数:复制构造函数、转换构造函数、初始化列表类的特殊成员:static成员、const成员、引用成员const对象成员对象和封闭类友元this指针,3,课堂问题,指出下列各题中的错误,并说明如何改正voidTime(int);classTimeprivate:inthour=12;intminute=0,second=0;intTime(intnHour,intnMin,intnSec);以下关于this指针的说法中不正确的是:A.const成员函数内部不可以使用this指针B.成员函数内的this指针,指向成员函数所作用的对象。C.在构造函数内部可以使用this指针D.在析构函数内部可以使用this指针,构造函数和析构函数不能有返回类型;成员属性不能在类定义时初始化,const成员函数内部可以使用this指针:是一个const指针,不能改变this的地址及所指向的值,4,课堂问题,指出下列题中的错误,并说明如何改正classXX(inti,intj):base(i),rem(base%j)intrem,base;如下定义和申明中哪些是错误的,如何改正:/example.hclassExamplepublic:staticdoublerate=6.5;staticconstintnSize=20;staticTimeTime(12,0,0);/example.c#include“example.h”doubleExample:rate;TimeExample:Time;,Base应在rem之前定义;或rem的初始化时不使用base,直接用i,静态成员变量或成员对象不能在定义时初始化,应在.c程序中以全局变量的方式初始化;静态const类型则可以,5,课堂问题,以下程序编译、连接都能通过,请写出运行时输出的结果。你认为没有输出的,就写无输出#includeusingnamespacestd;classSampleintA;staticintB;public:Sample(inta)A=a,B+=a;staticvoidfunc(Samples);voidSample:func(Samples)coutA=s.A,B=B、”进行流操作时,要求操作数是基本数据类型,8,C+提供了数据抽象的手段,允许用户定义抽象数据类型:类通过调用类的成员函数,对它的对象进行操作但是,在有些时候,用类的成员函数来操作对象时,很不方便。例如对一个群体,按照他们的体重指数进行排序:涉及不同对象中的“体重指数”成员属性在数学上,两个复数可以直接进行+、-等运算。但在C+中,直接将+或-用于复数是不允许的,抽象数据类型与运算符重载,9,运算符重载,我们希望:对一些抽象数据类型,也能够直接使用C+提供的运算符程序更简洁代码更容易理解例如boolcompareQuata=Bill”和“student_b更清晰:年龄大小、身材高矮、体型胖瘦、重载不改变运算符的优先级、结合性、语法结构及参数个数以下运算符不能被重载:“.”、“.*”、“:”、“?:”、sizeof教材p.100列出了可重载的运算符,18,运算符重载的形式,重载为类的成员函数return_typeoperatoroperator_symbol(argument-list)function-body重载为类的友员函数friendreturn_typeoperatorperator_symbol(argument-list)function-bodyoperator_symbol必须是C+中可以重载的运算符符号,例如“+”、“-”、重载运算符“调用()、下标、成员访问-或者赋值运算符=”时,运算符重载函数必须声明为类的成员函数,19,运算符重载为成员函数,return_typeoperatoroperator_symbol(argument-list)function-bodyargument-list中参数的个数比原operator_symbol所需要的参数个数少一个(后置“+”、“-”除外)例如classComplexpublic:Complex(double=0.0,double=0.0);/constructorComplexoperator+(constComplex,20,运算符重载为成员函数实现单目运算,单目运算:opoperand假如operand是类A的对象op应该重载为A的成员函数,该函数没有参数return_typeoperatorop()return_type是opoperand的类型例如:!string_s,等价于string_s.operator!()classStringpublic:String(constchar*=);/conversion/defaultconstructorString();/destructorbooloperator!()constreturnlength=0;/isStringempty?private:intlength;/stringlengthchar*sPtr;/pointertostartofstring;,21,运算符重载为成员函数实现双目运算,双目运算:operand_1opoperand_2假设operand_1是类A的对象op应该重载为A的成员函数,该函数只有一个参数return_typeoperatorop(argument_typeargument)return_type是operand_1opoperand_2的类型argument_type是operand_2的类型被重载双目运算符的两操作数类型可以相同classStringpublic:String(constchar*=);/conversion/defaultctorString();/destructorbooloperator=(constString,22,运算符重载为成员函数实现双目运算,被重载双目运算符的两操作数类型可以不同例如:set_a+element_a,等价于set_a.operator+(element_a)classCSetpublic:CStet();/constructorconstCSet,23,运算符重载为成员函数:小结,将运算符op重载为类A的成员函数时op是单目运算:在op所在的表达式中,op右边的操作数是类A的对象return_typeoperatorop()opoperand等价于operand.operatorop()op是双目运算:在op所在的表达式中,op左边的操作数是类A的对象return_typeoperatorop(argument_typeargument)operand_1opoperand_2等价于operand_1.operatorop(operand_2)operand_2可以是A的对象,也可以不是,24,运算符重载为友员函数,但是,在一些情况下,对类A进行双目运算符op的重载时,类A的对象只能作为op所在表达式的右操作数,左操作数不是A的对象将流操作符“”用于学生对象:coutstudent将“+”用于日期型对象:给定一个日期date,计算n天后的日期date+n:此时可以把“+”重载为成员函数date.operator+(n);n+date:怎么办?不允许这样写显然不符合思维的习惯,也失去了运算符重载的意义,25,运算符重载为友员函数,friendreturn_typeoperatoroperator_symbol(argument-list)function-bodyargument-list中参数的个数与原operator_symbol所需要的参数个数相同classStringfriendostream,26,运算符重载为友员函数,实现单目运算:opoperandoperand是类A的对象op应该重载为A的友员函数,该函数有一个参数friendreturn_typeoperatorop(Aarg)return_type是opoperand的类型例如:!string_s,等价于operator!(string_s)classStringfriendbooloperator!(constString,27,运算符重载为友员函数,实现双目运算:operand_1opoperand_2op被重载为A的友员函数,该函数有两个参数friendreturn_typeoperatorop(argT1arg1,argT2arg2)return_type是operand_1opoperand_2的类型argT1是operand_1的类型argT2是operand_2的类型operand_1和operand_2中至少有一个是类型为A的对象如果operand_1是类A的对象,则argT1为A在函数operatorop(argT1arg1,argT2arg2)的函数体中,可以访问类arg1的任何数据成员如果operand_2是类A的对象,则argT2为A在函数operatorop(argT1arg1,argT2arg2)的函数体中,可以访问类arg2的任何数据成员将双目运算符op重载为类A的友员函数时,可以:以非类A的对象作为op所在表达式的左操作数,28,流输入输出运算符的重载,cout5“this”;为什么能够成立?cout是什么?“”为什么能用在cout上?,29,cout是在iostream中定义的,ostream类的对象“”能用在cout上是因为在iostream.h里对“”进行了重载考虑,怎么重载才能使得cout5;和cout“this”都能成立?,流输入输出运算符的重载,30,voidoperator(constostream,流输入输出运算符的重载,31,怎么重载才能使得cout5y;voidfun(Mm1,M*m2);intmain()Mp(5,7),q;q.copy(,输出结果为:5,722,25,38,对象指针和对象引用作函数的参数,对象引用作函数参数在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍使用对象引用作函数参数具有用对象指针作函数参数的优点用对象引用作函数参数将更简单,更直接。,#includeusingnamespacestd;classMpublic:M()x=y=0;M(inti,intj)x=i;y=j;voidcopy(M,40,假定下面程序输出为5,请问该补写些什么?#includeusingnamespacestd;classCStudentpublic:intnAge;intmain()CStudents;s.nAge=5;couts;return0;,流输入输出运算符的重载,41,ostream,流输入输出运算符的重载,问题:cout5“this”;本质上的函数调用的形式是什么?(用重载后的写出),operator(operaotr(cout,5),“this”);,42,思考,intn=5;coutn+n;输出结果是什么?结果是为什么?,43,思考,因为coutn+n;可以理解成:operator(operator(cout,n+),n);而C/C+参数的计算顺序是从右到左,所以先入栈不是仅对cout成立即先将最右边的n入栈,在将n+入栈。之后先将n+出栈,输出n并执行自增运算,再出栈并输出n的栈中所存值,44,流输入输出运算符的重载,事实上在iostream里是将重载成成员函数classostreamostream的函数调用形式是什么呢?,45,流输入输出运算符的重载,是:cout.operator(n+).operator(n);实际上,这条语句可以直接写在程序里,其效果和coutn+(cin,phone);,返回值为引用,使得在Phonenumber上的对象输入操作可以串联:cinphone1phone2;,48,注意:函数operator被声明为PhoneNumber的友员函数,因为按照日常习惯,PhoneNumber的对象只能作为的右操作数总结:流运算符重载对于任何类A,如果希望对它重载流运算符“”,应该将函数operator声明为A的友员函数重载流运算符“”时,函数operator)必须定义为类成员函数,必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象。像一个二元操作符:接受一个对象和一个成员名,但事实上它不接受显式形参。例如:Ptr*operator-()returnptr;。这里没有形参,由编译器处理获取成员的工作。编写程序:ptr-action()时,实际上等价于:(ptr-action)()。而编译器按如下规则对ptr-action求值:ptr是一个指针,指向具有名为action的成员的类对象,则编译器将代码编译为调用该对象的action成员。否则,如果action是定义了operator-操作符的类的一个对象,则ptr-action与ptr.operator-()-action相同。即,执行ptr的operator-(),然后使用该结果重复这三步。否则代码出错,53,重载+和-运算符,自增运算符+、自减运算符-有前置/后置之分,为了区分所重载的是前置运算符还是后置运算符,C+规定前置运算符作为一元运算符重载class_a/constructorDate,Datenotareferencereturn/后置形式叫做“取回然后增加”。voidDate:dateIncrement(),Dated4(3,18,1969);+d4;/calld4.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论