《嵌入式Linux下C++程序設(shè)計(jì)--07多態(tài),運(yùn)算符重載,虛函數(shù),抽象類(lèi)》由會(huì)員分享,可在線閱讀,更多相關(guān)《嵌入式Linux下C++程序設(shè)計(jì)--07多態(tài),運(yùn)算符重載,虛函數(shù),抽象類(lèi)(34頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,中程在線信息產(chǎn)業(yè)培訓(xùn)網(wǎng),單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,
2、第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,嵌入式,Linux,下,QT,程序設(shè)
3、計(jì),主講:成寶宗,本章主要內(nèi)容,多態(tài)性,運(yùn)算符重載,虛函數(shù),純虛函數(shù),抽象類(lèi),3,多態(tài)性的概念,多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特征之一。,多態(tài)性是指發(fā)出同樣的消息被不同類(lèi)型的對(duì)象接收時(shí)有可能導(dǎo)致完全不同的行為。,多態(tài)的實(shí)現(xiàn):,函數(shù)重載:相同函數(shù)名,不同函數(shù)參數(shù)。,運(yùn)算符重載:對(duì)原有運(yùn)算符增加其他功能。,虛函數(shù):用于動(dòng)態(tài)綁定,根據(jù)參數(shù)類(lèi)型不同,自動(dòng)調(diào)用對(duì)應(yīng)函數(shù)。,4,運(yùn)算符重載,運(yùn)算符重載是對(duì)已有的運(yùn)算符賦予多重含義,必要性,C+,中預(yù)定義的運(yùn)算符其運(yùn)算對(duì)象只能是基本數(shù)據(jù)類(lèi)型,而不適用于用戶(hù)自定義類(lèi)型(如類(lèi)),實(shí)現(xiàn)機(jī)制,將指定的運(yùn)算表達(dá)式轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對(duì)象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參。
4、,編譯系統(tǒng)對(duì)重載運(yùn)算符的選擇,遵循函數(shù)重載的選擇原則。,5,規(guī)則和限制,可以重載,C+,中除下列運(yùn)算符外的所有運(yùn)算符:,.*:?:,只能重載,C+,語(yǔ)言中已有的運(yùn)算符,不可臆造新的。,不改變?cè)\(yùn)算符的優(yōu)先級(jí)和結(jié)合性。,不能改變操作數(shù)個(gè)數(shù)。,經(jīng)重載的運(yùn)算符,其操作數(shù)中至少應(yīng)該有一個(gè)是自定義類(lèi)型。,6,兩種形式,重載為類(lèi)的非靜態(tài)成員函數(shù),重載為非成員函數(shù),7,運(yùn)算符函數(shù),聲明形式,函數(shù)類(lèi)型,operator,運(yùn)算符(形參),.,重載為類(lèi)成員函數(shù)時(shí),參數(shù)個(gè)數(shù),=,原操作數(shù)個(gè)數(shù),-1,(后置,+,、,-,除外),重載為非成員函數(shù)時(shí),參數(shù)個(gè)數(shù),=,原操作數(shù)個(gè)數(shù),,且至少應(yīng)該有一個(gè)自定義類(lèi)型的形參。,8,
5、運(yùn)算符成員函數(shù)的設(shè)計(jì),雙目運(yùn)算符,B,如果要重載,B,為類(lèi)成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式,oprd1 B oprd2,,其中,oprd1,為,A,類(lèi)對(duì)象,則,B,應(yīng)被重載為,A,類(lèi)的成員函數(shù),形參類(lèi)型應(yīng)該是,oprd2,所屬的類(lèi)型。,經(jīng)重載后,表達(dá)式,oprd1 B oprd2,相當(dāng)于,oprd1.operator B(oprd2),9,運(yùn)算符重載,將,“,+,”,、,“,-,”,運(yùn)算重載為復(fù)數(shù)類(lèi)的成員函數(shù)。,規(guī)則,:,實(shí)部和虛部分別相加減。,操作數(shù),:,兩個(gè)操作數(shù)都是復(fù)數(shù)類(lèi)的對(duì)象。,#include,using namespace std;,class Complex/,復(fù)數(shù)類(lèi)定義,publi
6、c:/,外部接口,Complex(double,r=0.0,double i=0.0):,real(r,),imag(i,)/,構(gòu)造函數(shù),Complex operator+(const Complex/,運(yùn)算符,+,重載成員函數(shù),Complex operator-(const Complex/,運(yùn)算符,-,重載成員函數(shù),void display()const;/,輸出復(fù)數(shù),private:/,私有數(shù)據(jù)成員,double real;/,復(fù)數(shù)實(shí)部,double,imag,;/,復(fù)數(shù)虛部,;Complex,Complex:operator,+(const Complex&c2)const/,重載運(yùn)算
7、符函數(shù)實(shí)現(xiàn),return,Complex(real,+c2.real,imag,+c2.imag);/,創(chuàng)建一個(gè)臨時(shí)無(wú)名對(duì)象作為返回值,Complex,Complex:operator,-(const Complex&c2)const/,重載運(yùn)算符函數(shù)實(shí)現(xiàn),return,Complex(real,-c2.real,imag,-c2.imag);/,創(chuàng)建一個(gè)臨時(shí)無(wú)名對(duì)象作為返回值,void,Complex:display,()const,cout,(real ,imag,),endl,;,int,main()/,主函數(shù),Complex c1(5,4),c2(2,10),c3;/,定義復(fù)數(shù)類(lèi)的對(duì)象
8、,cout,c1=;c1.display();,cout,c2=;c2.display();,c3=c1-c2;/,使用重載運(yùn)算符完成復(fù)數(shù)減法,cout,c3=c1-c2=;c3.display();,c3=c1+c2;/,使用重載運(yùn)算符完成復(fù)數(shù)加法,cout,c3=c1+c2=;c3.display();,return 0;,程序輸出的結(jié)果為:,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
9、:,Point(int,a=0,int,b=0):x(a),y(b),friend Point,operator+(Point,&,p,Point,/,友元函數(shù),Point operator-(Point/,成員函數(shù),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*,ar
10、gv,),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,運(yùn)算符成員函數(shù)的設(shè)計(jì),前置單目運(yùn)算符,U,如果要重載,U,為類(lèi)成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式,U,oprd,,其中,oprd,為,A,類(lèi)對(duì)象,則,U,應(yīng)被重載為,A,類(lèi)的成員函數(shù),無(wú)形參。,經(jīng)重載后,表達(dá)式,U,oprd,相當(dāng)于,oprd.operator,U(),14,運(yùn)算符成員函數(shù)的設(shè)計(jì),后置單目運(yùn)算符,+,和,-,如果要重載,+,或,-,為類(lèi)成員函數(shù),使之能夠?qū)?/p>
11、現(xiàn)表達(dá)式,oprd,+,或,oprd,-,,其中,oprd,為,A,類(lèi)對(duì)象,則,+,或,-,應(yīng)被重載為,A,類(lèi)的成員函數(shù),且具有一個(gè),int,類(lèi)型,形參,。,經(jīng)重載后,表達(dá)式,oprd,+,相當(dāng)于,oprd.operator,+(0),15,運(yùn)算符重載,運(yùn)算符前置,+,和后置,+,重載為時(shí)鐘類(lèi)的成員函數(shù)。,前置單目運(yùn)算符,重載函數(shù)沒(méi)有形參,對(duì)于后置單目運(yùn)算符,重載函數(shù)需要有一個(gè)整型形參。,操作數(shù)是時(shí)鐘類(lèi)的對(duì)象。,實(shí)現(xiàn)時(shí)間增加,1,秒鐘。,#include,using namespace std;,class Clock/,時(shí)鐘類(lèi)聲明定義,public:/,外部接口,Clock(int,hour
12、=0,int,minute=0,int,second=0);,void,showTime,()const;,Clock/,前置單目運(yùn)算符重載,Clock operator+(,int,);/,后置單目運(yùn)算符重載,private:/,私有數(shù)據(jù)成員,int,hour,minute,second;,;,/,前置單目運(yùn)算符重載函數(shù),Clock&,Clock:operator,+(),second+;,if(second=60),second-=60;,minute+;,if(minute=60),minute-=60;,hour=(hour+1)%24;,return*this;,/,后置單目運(yùn)算符重
13、載,Clock,Clock:operator,+(,int,),/,注意形參表中的整型參數(shù),Clock old=*this;,+(*this);/,調(diào)用前置“,+”,運(yùn)算符,return old;,/,其它成員函數(shù)的實(shí)現(xiàn)略,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;,程序
14、運(yùn)行結(jié)果為:,First time output:23:59:59,Show,myClock,+:23:59:59,Show+,myClock,:0:0:1,18,運(yùn)算符非成員函數(shù)的設(shè)計(jì),函數(shù)的形參代表依自左至右次序排列的各操作數(shù)。,后置單目運(yùn)算符,+,和,-,的重載函數(shù),形參列表中要增加一個(gè),int,,但不必寫(xiě)形參名。,如果在運(yùn)算符的重載函數(shù)中需要操作某類(lèi)對(duì)象的私有成員,可以將此函數(shù)聲明為該類(lèi)的友元。,19,運(yùn)算符非成員函數(shù)的設(shè)計(jì),雙目運(yùn)算符,B,重載后,表達(dá)式,oprd1 B oprd2,等同于,operator B(oprd1,oprd2),前置單目運(yùn)算符,B,重載后,,表達(dá)式,B,op
15、rd,等同于,operator,B(oprd,),后置單目運(yùn)算符,+,和,-,重載后,,表達(dá)式,oprd,B,等同于,operator B(oprd,0),20,例,8-3,將,+,、,-,(雙目)重載為非成員函數(shù),,并將其聲明為復(fù)數(shù)類(lèi)的友元,兩個(gè)操作數(shù)都是復(fù)數(shù)類(lèi)的常引用。,將,(雙目)重載為非成員函數(shù),并將其聲明為復(fù)數(shù)類(lèi)的友元,它的左操作數(shù)是,std:ostream,引用,右操作數(shù)為復(fù)數(shù)類(lèi)的常引用,返回,std:ostream,引用,用以支持下面形式的輸出:,cout,a b;,該輸出調(diào)用的是:,operator (operator (,cout,a),b);,#include,using
16、namespace std;,class Complex/,復(fù)數(shù)類(lèi)定義,public:/,外部接口,Complex(double,r=0.0,double i=0.0):,real(r,),imag(i,)/,構(gòu)造函數(shù),friend Complex operator+(const Complex/,運(yùn)算符,+,重載,friend Complex operator-(const Complex/,運(yùn)算符,-,重載,friend,ostream,&operator (,ostream,/,運(yùn)算符,重載,private:/,私有數(shù)據(jù)成員,double real;/,復(fù)數(shù)實(shí)部,double,imag,;/,復(fù)數(shù)虛部,;,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