资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,中程在线信息产业培训网,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式,Linux,下,QT,程序设计,主讲:成宝宗,本章主要内容,多态性,运算符重载,虚函数,纯虚函数,抽象类,3,多态性的概念,多态性是面向对象程序设计的重要特征之一。,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。,多态的实现:,函数重载:相同函数名,不同函数参数。,运算符重载:对原有运算符增加其他功能。,虚函数:用于动态绑定,根据参数类型不同,自动调用对应函数。,4,运算符重载,运算符重载是对已有的运算符赋予多重含义,必要性,C+,中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类),实现机制,将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。,编译系统对重载运算符的选择,遵循函数重载的选择原则。,5,规则和限制,可以重载,C+,中除下列运算符外的所有运算符:,.*:?:,只能重载,C+,语言中已有的运算符,不可臆造新的。,不改变原运算符的优先级和结合性。,不能改变操作数个数。,经重载的运算符,其操作数中至少应该有一个是自定义类型。,6,两种形式,重载为类的非静态成员函数,重载为非成员函数,7,运算符函数,声明形式,函数类型,operator,运算符(形参),.,重载为类成员函数时,参数个数,=,原操作数个数,-1,(后置,+,、,-,除外),重载为非成员函数时,参数个数,=,原操作数个数,,且至少应该有一个自定义类型的形参。,8,运算符成员函数的设计,双目运算符,B,如果要重载,B,为类成员函数,使之能够实现表达式,oprd1 B oprd2,,其中,oprd1,为,A,类对象,则,B,应被重载为,A,类的成员函数,形参类型应该是,oprd2,所属的类型。,经重载后,表达式,oprd1 B oprd2,相当于,oprd1.operator B(oprd2),9,运算符重载,将,“,+,”,、,“,-,”,运算重载为复数类的成员函数。,规则,:,实部和虚部分别相加减。,操作数,:,两个操作数都是复数类的对象。,#include,using namespace std;,class Complex/,复数类定义,public:/,外部接口,Complex(double,r=0.0,double i=0.0):,real(r,),imag(i,)/,构造函数,Complex operator+(const Complex/,运算符,+,重载成员函数,Complex operator-(const Complex/,运算符,-,重载成员函数,void display()const;/,输出复数,private:/,私有数据成员,double real;/,复数实部,double,imag,;/,复数虚部,;Complex,Complex:operator,+(const Complex&c2)const/,重载运算符函数实现,return,Complex(real,+c2.real,imag,+c2.imag);/,创建一个临时无名对象作为返回值,Complex,Complex:operator,-(const Complex&c2)const/,重载运算符函数实现,return,Complex(real,-c2.real,imag,-c2.imag);/,创建一个临时无名对象作为返回值,void,Complex:display,()const,cout,(real ,imag,),endl,;,int,main()/,主函数,Complex c1(5,4),c2(2,10),c3;/,定义复数类的对象,cout,c1=;c1.display();,cout,c2=;c2.display();,c3=c1-c2;/,使用重载运算符完成复数减法,cout,c3=c1-c2=;c3.display();,c3=c1+c2;/,使用重载运算符完成复数加法,cout,c3=c1+c2=;c3.display();,return 0;,程序输出的结果为:,c1=(5,4),c2=(2,10),c3=c1-c2=(3,-6),c3=c1+c2=(7,14),11,#include,using namespace std;,class Point,private:,int,x;,int,y;,public:,Point(int,a=0,int,b=0):x(a),y(b),friend Point,operator+(Point,&,p,Point,/,友元函数,Point operator-(Point/,成员函数,void,show()cout,(x=x,y=y),endl,;,;,Point,operator+(Point,&,p,Point,&q),return,Point(p.x+q.x,p.y+q.y,);,;,Point,Point:operator,-(Point&p),return,Point(x-p.x,y-p.y,);,int,main(int,argc,char*,argv,),Point a(4,5);,Point b(10,20);,Point c;,Point d;,d=a-b;,c=,a+b,;,a.show,();,b.show,();,c.show,();,d.show,();,13,运算符成员函数的设计,前置单目运算符,U,如果要重载,U,为类成员函数,使之能够实现表达式,U,oprd,,其中,oprd,为,A,类对象,则,U,应被重载为,A,类的成员函数,无形参。,经重载后,表达式,U,oprd,相当于,oprd.operator,U(),14,运算符成员函数的设计,后置单目运算符,+,和,-,如果要重载,+,或,-,为类成员函数,使之能够实现表达式,oprd,+,或,oprd,-,,其中,oprd,为,A,类对象,则,+,或,-,应被重载为,A,类的成员函数,且具有一个,int,类型,形参,。,经重载后,表达式,oprd,+,相当于,oprd.operator,+(0),15,运算符重载,运算符前置,+,和后置,+,重载为时钟类的成员函数。,前置单目运算符,重载函数没有形参,对于后置单目运算符,重载函数需要有一个整型形参。,操作数是时钟类的对象。,实现时间增加,1,秒钟。,#include,using namespace std;,class Clock/,时钟类声明定义,public:/,外部接口,Clock(int,hour=0,int,minute=0,int,second=0);,void,showTime,()const;,Clock/,前置单目运算符重载,Clock operator+(,int,);/,后置单目运算符重载,private:/,私有数据成员,int,hour,minute,second;,;,/,前置单目运算符重载函数,Clock&,Clock:operator,+(),second+;,if(second=60),second-=60;,minute+;,if(minute=60),minute-=60;,hour=(hour+1)%24;,return*this;,/,后置单目运算符重载,Clock,Clock:operator,+(,int,),/,注意形参表中的整型参数,Clock old=*this;,+(*this);/,调用前置“,+”,运算符,return old;,/,其它成员函数的实现略,int,main(),Clock myClock(23,59,59);,cout,First time output:;,myClock.showTime,();,cout,Show,myClock,+:;,(,myClock+).showTime,();,cout,Show+,myClock,:;,(+,myClock).showTime,();,return 0;,程序运行结果为:,First time output:23:59:59,Show,myClock,+:23:59:59,Show+,myClock,:0:0:1,18,运算符非成员函数的设计,函数的形参代表依自左至右次序排列的各操作数。,后置单目运算符,+,和,-,的重载函数,形参列表中要增加一个,int,,但不必写形参名。,如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元。,19,运算符非成员函数的设计,双目运算符,B,重载后,表达式,oprd1 B oprd2,等同于,operator B(oprd1,oprd2),前置单目运算符,B,重载后,,表达式,B,oprd,等同于,operator,B(oprd,),后置单目运算符,+,和,-,重载后,,表达式,oprd,B,等同于,operator B(oprd,0),20,例,8-3,将,+,、,-,(双目)重载为非成员函数,,并将其声明为复数类的友元,两个操作数都是复数类的常引用。,将,(双目)重载为非成员函数,并将其声明为复数类的友元,它的左操作数是,std:ostream,引用,右操作数为复数类的常引用,返回,std:ostream,引用,用以支持下面形式的输出:,cout,a b;,该输出调用的是:,operator (operator (,cout,a),b);,#include,using namespace std;,class Complex/,复数类定义,public:/,外部接口,Complex(double,r=0.0,double i=0.0):,real(r,),imag(i,)/,构造函数,friend Complex operator+(const Complex/,运算符,+,重载,friend Complex operator-(const Complex/,运算符,-,重载,friend,ostream,&operator (,ostream,/,运算符,重载,private:/,私有数据成员,double real;/,复数实部,double,imag,;/,复数虚部,;,Complex operator+(const Complex&c1,const Complex&c2),return Complex(c1.real+c2.real,c1.imag+c2.imag);,Complex operator-(const Complex&c1,const Complex&c2),return Complex(c1.real-c2.real,c1.i
展开阅读全文