C++程序设计基础教程 第2版 课件 第10章 运算符重载_第1页
C++程序设计基础教程 第2版 课件 第10章 运算符重载_第2页
C++程序设计基础教程 第2版 课件 第10章 运算符重载_第3页
C++程序设计基础教程 第2版 课件 第10章 运算符重载_第4页
C++程序设计基础教程 第2版 课件 第10章 运算符重载_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

第10章运算符重载主要内容10.1什么是运算符重载10.2运算符重载规则10.3运算符重载的实现形式10.4应用实例10.1什么是运算符重载函数重载的实现形式回顾:intabs(intn){//求整型变量的绝对值 if(n<0)n=-n;returnn;}floatabs(floatf){//求单精度实型变量的绝对值 if(f<0)f=-f;returnf;}doubleabs(doubledd){//求双精度实型变量的绝对值 if(d<0)return–d;returnd;}优点:用户仅需要记忆一个函数名4C++语言中的运算符实际上是函数的方便表示形式。Complexa,b,c;c=a+b;Complexadd(Complex&b){Complexc;c.real=real+b.real;c.imag=imag+b.imag;returnc;}Complexa,b,c;c=a.add(b);思考:复数的相加能够通过+运算符来实现吗?

5运算符重载

对运算符重新赋予新的含义,使之实现新功能。必要性

C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)。实现机制

将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。

编译系统对重载运算符的选择,遵循函数重载的选择原则。6定义一个重载运算符的函数,需要执行被重载的运算符时,系统自动调用该函数,实现相应运算。运算符重载的实质:函数重载。一般定义格式

函数类型operator运算符名称(形参表列){对运算符的重载处理}复数运算重载ComplexComplex∷operator+(Complex&c2){Complexc;c.real=real+c2.real;c.imag=imag+c2.imag;returnc;}……voidmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;c3.display();}C++编译系统将程序中c3=c1+c2;解释为c3=c1.operator+(c2);注意:运算符被重载后,其原有的功能仍然保留,没有丧失或改变。10.2运算符重载规则(1)不许定义新运算符,只能重载已有运算符(2)允许重载的运算符见P214。而不能重载的运算符只有5个。

.

//成员访问运算符

.*

//成员指针访问运算符

//域运算符sizeof

//长度运算符

?:

//条件运算符910.2运算符重载规则(3)重载不能改变运算符运算对象的个数(4)重载不能改变运算符的优先级别(5)重载不能改变运算符的结合性(6)重载运算符的函数不能有默认参数(7)须和用户自定义类型的对象一起使用,其参数至少有一个是类对象(或其引用)。1010.2运算符重载规则(8)用于类对象的运算符一般必须重载,但“=”和“&”例外。(9)应使重载后的功能类似于该运算符作用于标准类型数据时实现的功能。(10)运算符重载形式:类的成员函数、类的友元函数。1110.3运算符重载的实现形式重载为类成员函数时

重载为友元函数时参数个数=原操作数个数-1(后置++、--除外)不需要传递的参数,利用this指针解决参数个数=原操作数个数,且至少应该有一个自定义类型的形参。1310.3.1重载为类的成员函数(1)单目运算符重载为类的成员函数需不需要传递任何参数

不需要传递参数,利用this指针解决如何区分运算符前置运算符和后置运算符

使用一个整型(int)形参进行区分重载单目运算符前置情况:先对操作数进行修改,然后再返回修改后的操作数后置情况:先返回修改前的值,然后操作数进行修改运算符前置时,参数与返回的是同一个对象。运算符后置时,需要创建一个临时对象,存放原有的值,返回的应该是存放原有对象值的临时对象。++或--重载的格式语法格式如下:

<函数类型>operator++();//前置运算

<函数类型>operator++(int)//后置运算

使用前置运算符的语法格式如下:

++对象;//对象.operator++();

使用后置运算符的语法格式如下:

对象++;

//对象.operator++(int);仅用于区分重载函数,实际使用不需要传递实参。【例10-2】单目运算符重载为类的成员函数举例,实现时间对象的自增自减运算。#include<iostream>usingnamespacestd;classTime{ public: Time(){ minute=0; sec=0; } Time(intm,ints):minute(m),sec(s){} Time&operator++();//前置++ Time&operator--();//前置-- Timeoperator++(int);//后置++ Timeoperator--(int);//后置-- voiddisplay(){ cout<<minute<<":"<<sec<<endl;

} private: intminute; intsec;};Time&Time::operator++(){ sec+=1; if(sec>=60){ sec-=60; ++minute; } return*this;}TimeTime::operator++(int){ Timeresult=*this; sec+=1; if(sec>=60){ sec-=60; ++minute; } returnresult;}Time&Time::operator--(){ sec=sec-1; if(sec<0){ sec+=60; --minute; } return*this;}TimeTime::operator--(int){ Timeresult=*this; sec=sec-1; if(sec<0){ sec+=60; --minute; } returnresult;}intmain(){ Timetime1(34,0); ++time1; cout<<"++time1后的结果"<<endl; time1.display(); time1++; cout<<"time1++后的结果"<<endl; time1.display(); --time1; cout<<"--time1后的结果"<<endl; time1.display(); time1--; cout<<"time1--后的结果"<<endl; time1.display(); return0;}(2)双目运算符重载为类的成员函数【例10-3】双目运算符重载为类的成员函数举例,实现复数的乘除运算。classCComplex{

private: doublereal; doubleimag; public: CComplex(doubler=0,doublei=0); voidPrint(); CComplexoperator*(CComplexc);

CComplexoperator/(CComplexc);};CComplexCComplex::operator*(CComplexc){

CComplextemp; temp.real=real*c.real-imag*c.imag; temp.imag=imag*c.real+real*c.imag; returntemp;}CComplexCComplex::operator/(CComplexc){

CComplextemp;

temp.real=(real*c.real+imag*c.imag)/(c.real*c.real+c.imag*c.imag);

temp.imag=(imag*c.real-real*c.imag)/(c.real*c.real+c.imag*c.imag); returntemp;}10.3.2重载为友元函数(1)单目运算符重载为友元函数classTime{

……

friendTime&operator++(Time&t); //前置++ friendTime&operator--(Time&t); //前置-- friendTimeoperator++(Time&t,int); //后置++ friendTimeoperator--(Time&t,int); //后置--

……};Time&operator++(Time&t){ t.sec+=1; if(t.sec>=60){ t.sec-=60; ++t.minute; } returnt;}Timeoperator++(Time&t,int){ Timeresult=t; t.sec+=1; if(t.sec>=60){ t.sec-=60; ++t.minute; } returnresult;}Time&operator--(Time&t){ t.sec=t.sec-1; if(t.sec<0){ t.sec+=60; --t.minute; } returnt;}Timeoperator--(Time&t,int){ Timeresult=t; t.sec=t.sec-1; if(t.sec<0){ t.sec+=60; --t.minute; } returnresult;}(2)双目运算符重载为友元函数classTriCoor{ public:

TriCoor(intmx=0,intmy=0,intmz=0); friendTriCooroperator+(TriCoor&t1,TriCoor&t2); friendTriCooroperator-(TriCoor&t1,TriCoor&t2); friendTriCoor&operator++(TriCoor&t); voidshow(); voidassign(intmx,intmy,intmz); private: intx,y,z; //3_dcoordinates};TriCooroperator+(TriCoor&t1,TriCoor&t2){ TriCoortemp; temp.x=t1.x+t2.x; temp.y=t1.y+t2.y; temp.z=t1.z+t2.z; returntemp;}TriCooroperator-(TriCoor&t1,TriCoor&t2){ TriCoortemp; temp.x=t1.x-t2.x; temp.y=t1.y-t2.y; temp.z=t1.z-t2.z; returntemp;}10.4应用实例【例10-6】重载赋值运算符“=”。32classString{private:intlen;char*con;public: String()//定义构造函数

{ cout<<"String()..."<<endl; len=0;con=0;} String(String&str) { cout<<"String(String&str)..."<<endl; len=str.len; if(str.len) { con=newchar[len+1]; strcpy(con,str.con);} }33String(char*str){ cout<<"String(char*)..."<<endl; if(str){len=strlen(str); con=newchar[len+1]; strcpy(con,str);} else{ len=0; con=0;} } ~String(){//声明析构函数 cout<<"~String()..."; if(con) {cout<<"con="<<con<<endl; delete[]con;} }

34friendStringoperator+(Strings1,Strings2);//重载+String&operator=(String&str){//重载= cout<<"operator="<<endl; if(this==&str){ return*this; } else{ len=str.len; if(con)delete[]con; con=newchar[len+1]; str

温馨提示

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

评论

0/150

提交评论