




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6 6講講 多態(tài)性多態(tài)性(2)(2)2本講主要內(nèi)容本講主要內(nèi)容什么是多態(tài)性什么是多態(tài)性應(yīng)用虛函數(shù)實(shí)現(xiàn)多態(tài)性應(yīng)用虛函數(shù)實(shí)現(xiàn)多態(tài)性純虛函數(shù)與抽象類純虛函數(shù)與抽象類創(chuàng)建和調(diào)用運(yùn)算符函數(shù)創(chuàng)建和調(diào)用運(yùn)算符函數(shù)3創(chuàng)建和調(diào)用運(yùn)算符函數(shù)創(chuàng)建和調(diào)用運(yùn)算符函數(shù)41.運(yùn)算符重載的需要性運(yùn)算符重載的需要性 C+認(rèn)為認(rèn)為用戶定義的數(shù)據(jù)類型用戶定義的數(shù)據(jù)類型就像就像基本數(shù)據(jù)類型基本數(shù)據(jù)類型int和和char一樣有效。一樣有效。運(yùn)算符運(yùn)算符(如(如+、-、*、/)是為基本數(shù)據(jù)類型定義的,)是為基本數(shù)據(jù)類型定義的,為什么不允許為什么不允許用于用于用戶自己定義的類型呢?用戶自己定義的類型呢? 5例如:例如:class A
2、public : A ( int x ) a = x ; /.;A a ( 5 ) , b ( 10 ) , c ;c = a + b ; /類對(duì)象也應(yīng)能運(yùn)算類對(duì)象也應(yīng)能運(yùn)算 62. 怎樣進(jìn)行運(yùn)算符重載怎樣進(jìn)行運(yùn)算符重載運(yùn)算符運(yùn)算符是在是在C+系統(tǒng)內(nèi)部定義的,系統(tǒng)內(nèi)部定義的,具有特定的具有特定的語法規(guī)則,如參數(shù)說明,運(yùn)算順序,優(yōu)先級(jí)語法規(guī)則,如參數(shù)說明,運(yùn)算順序,優(yōu)先級(jí)別別等。等。重載運(yùn)算符時(shí),要注意該重載運(yùn)算符的運(yùn)算順重載運(yùn)算符時(shí),要注意該重載運(yùn)算符的運(yùn)算順序和優(yōu)先級(jí)別不變。序和優(yōu)先級(jí)別不變。7如下例:如下例:class A public : A ( int n ) /. operator
3、+ ( A& , A&) /. operator * ( A& , A&) /. / .;A a = 5 , b = 6 ; c = 7 , d = 8 , e;e = a + b * c + d ; /即即 ( a + ( b * c ) + d )8運(yùn)算符重載運(yùn)算符重載 “語法修飾語法修飾”有了運(yùn)算符,編程就顯得方便。例如,對(duì)于直有了運(yùn)算符,編程就顯得方便。例如,對(duì)于直角三角形斜邊長(zhǎng)度公式角三角形斜邊長(zhǎng)度公式c = ,用函數(shù)用函數(shù)化的格式表示:化的格式表示: c = sqrt ( add ( mult ( a , a ) , mult ( b , b ) )
4、 ) ;用運(yùn)算符的格式表示:用運(yùn)算符的格式表示: c = sqrt ( a * a + b * b ) ;22ba 9重載的形式重載的形式運(yùn)算符是函數(shù)運(yùn)算符是函數(shù),除了運(yùn)算順序和優(yōu)先級(jí)別不能,除了運(yùn)算順序和優(yōu)先級(jí)別不能更改外,參數(shù)和返回類型是可以重新說明的,更改外,參數(shù)和返回類型是可以重新說明的,即可以重載。即可以重載。重載的形式是:重載的形式是: 返回類型返回類型 operator 運(yùn)算符號(hào)(參數(shù)說明);運(yùn)算符號(hào)(參數(shù)說明);10例如:例如: A類對(duì)象的加法:類對(duì)象的加法:class A ;int operator + ( A& , A& ) ; /兩個(gè)兩個(gè)A A類對(duì)象參加運(yùn)
5、算,返回類對(duì)象參加運(yùn)算,返回intint型值型值 11運(yùn)算符重載的方式運(yùn)算符重載的方式運(yùn)算符重載是通過建立運(yùn)算符函數(shù)運(yùn)算符重載是通過建立運(yùn)算符函數(shù)operator()來實(shí)現(xiàn)來實(shí)現(xiàn)的。的。運(yùn)算符函數(shù)運(yùn)算符函數(shù)operator( )定義了重載的運(yùn)算符將要進(jìn)定義了重載的運(yùn)算符將要進(jìn)行的操作,行的操作,這種操作通常作用在一個(gè)類上這種操作通常作用在一個(gè)類上。運(yùn)算符函數(shù)通常有兩種:運(yùn)算符函數(shù)通常有兩種:類成員運(yùn)算符函數(shù)類成員運(yùn)算符函數(shù)類的友元運(yùn)算符函數(shù)類的友元運(yùn)算符函數(shù)講義上還介紹了運(yùn)算符的重載第三種方式:講義上還介紹了運(yùn)算符的重載第三種方式:作為類外的普通函數(shù)(很少使用)作為類外的普通函數(shù)(很少使用)1
6、23. 建立類成員運(yùn)算符函數(shù)建立類成員運(yùn)算符函數(shù)成員運(yùn)算符函數(shù)的一般聲明格式:成員運(yùn)算符函數(shù)的一般聲明格式:class A /. 返回值類型返回值類型 operator C+運(yùn)算符運(yùn)算符(參數(shù)表參數(shù)表); /.;返回值類型返回值類型 類名類名:operator C+運(yùn)算符運(yùn)算符(參數(shù)表參數(shù)表) 定義將要重載的定義將要重載的C+運(yùn)算符的操作運(yùn)算符的操作 13通過成員函數(shù)實(shí)現(xiàn)運(yùn)算符的重載通過成員函數(shù)實(shí)現(xiàn)運(yùn)算符的重載【例4-1】 通過重載運(yùn)算符通過重載運(yùn)算符“”,實(shí)現(xiàn)日期類對(duì)象,實(shí)現(xiàn)日期類對(duì)象的的“”比較運(yùn)算。比較運(yùn)算。說明:本例以成員函數(shù)的方式進(jìn)行運(yùn)算符說明:本例以成員函數(shù)的方式進(jìn)行運(yùn)算符“”的重
7、的重載。載。#include using namespace std;class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);int GetYear();int GetMonth();int GetDay();bool operator(CDate date);比較運(yùn)算符比較運(yùn)算符“”的重載的重載關(guān)鍵字關(guān)鍵字operator函數(shù)名是函數(shù)名是: operatorCDate:CDate(int nYear, int nMonth, int nDay)m_nYear =
8、 nYear;m_nMonth = nMonth;m_nDay = nDay;int CDate:GetYear()return m_nYear;int CDate:GetMonth()return m_nMonth;int CDate:GetDay()return m_nDay;bool CDate:operator(CDate date) if(m_nYear date.m_nYear)return true;if(m_nYear = date.m_nYear) & (m_nMonth date.m_nMonth)return true;if(m_nYear = date.m_nY
9、ear) & (m_nMonth = date.m_nMonth) & (m_nDay date.m_nDay)return true;return false;int main() CDate date1(1992, 3, 18), date2(1992, 4, 5);if (date1 date2) coutdate1早于早于date2n;elsecoutdate1不早于不早于date2n;return 0; 運(yùn)算符函數(shù)的隱式調(diào)用。也可以寫成:運(yùn)算符函數(shù)的隱式調(diào)用。也可以寫成:if(date1.operator(date2) /顯式調(diào)用顯式調(diào)用date1是左操作數(shù)是左操作數(shù)
10、 date2是右操作數(shù)是右操作數(shù)比較運(yùn)算是雙目運(yùn)算,比較運(yùn)算是雙目運(yùn)算,為什么只有一個(gè)參數(shù)?為什么只有一個(gè)參數(shù)?請(qǐng)思考。請(qǐng)思考。因?yàn)槌蓡T運(yùn)算符函數(shù),參數(shù)中隱含的有一個(gè)因?yàn)槌蓡T運(yùn)算符函數(shù),參數(shù)中隱含的有一個(gè)thisthis指針,所以對(duì)于雙目算符,類成員運(yùn)算符函數(shù)有指針,所以對(duì)于雙目算符,類成員運(yùn)算符函數(shù)有一個(gè)參數(shù)。一個(gè)參數(shù)。當(dāng)成員函數(shù)重載雙目算符時(shí),有一個(gè)參數(shù)沒有被當(dāng)成員函數(shù)重載雙目算符時(shí),有一個(gè)參數(shù)沒有被顯式地傳遞給成員運(yùn)算符函數(shù)顯式地傳遞給成員運(yùn)算符函數(shù), ,該參數(shù)是通過該參數(shù)是通過thisthis指針隱含地傳遞給函數(shù)的。指針隱含地傳遞給函數(shù)的。 17例如例如bool CDate:opera
11、tor(CDate date) if(m_nYear date.m_nYear)return true;if(m_nYear = date.m_nYear) & (m_nMonth date.m_nMonth)return true;if(m_nYear = date.m_nYear) & (m_nMonth = date.m_nMonth) & (m_nDay date.m_nDay)return true;return false;bool CDate:operatorm_nYear m_nYear = date.m_nYear) & (this- m_nM
12、onth m_nYear = date.m_nYear) & (this- m_nMonth = date.m_nMonth) & (this- m_nDay date.m_nDay)return true;return false;18例如例如調(diào)用時(shí):調(diào)用時(shí):if (date1 date2) 相當(dāng)于:相當(dāng)于:if(date1.operator(date2)并相當(dāng)于:并相當(dāng)于:if(date1.operator(&date1,date2)194. 建立友元運(yùn)算符函數(shù)建立友元運(yùn)算符函數(shù) 友元運(yùn)算符函數(shù)的聲明格式:友元運(yùn)算符函數(shù)的聲明格式:class A / friend
13、返回值類型返回值類型 operator c+運(yùn)算符運(yùn)算符(參數(shù)表參數(shù)表);返回值類型返回值類型 operator c+運(yùn)算符運(yùn)算符(參數(shù)表參數(shù)表) 定義將要重載的定義將要重載的c+運(yùn)算符的操作運(yùn)算符的操作 20通過友元函數(shù)實(shí)現(xiàn)運(yùn)算符的重載通過友元函數(shù)實(shí)現(xiàn)運(yùn)算符的重載【例4-1補(bǔ)充】 通過重載運(yùn)算符通過重載運(yùn)算符“”,實(shí)現(xiàn)日期類,實(shí)現(xiàn)日期類對(duì)象的對(duì)象的“”比較運(yùn)算。比較運(yùn)算。說明:本例以友元函數(shù)的方式進(jìn)行運(yùn)算符說明:本例以友元函數(shù)的方式進(jìn)行運(yùn)算符“”的重的重載。載。/Person.hclass CDate friend bool operator(CDate date1,CDate date2)
14、;/Person.cppbool operator(CDate date1,CDate date2)if(date1.m_nYear date2.m_nYear)return true;if(date1.m_nYear = date2.m_nYear) & (date1.m_nMonth date2.m_nMonth)return true;if(date1.m_nYear = date2.m_nYear) & (date1.m_nMonth = date2.m_nMonth) & (date1.m_nDay date2.m_nDay)return true;retur
15、n false;22注意注意 在在Visual C+6.0)環(huán)境中調(diào)試該程序,這時(shí)會(huì)出現(xiàn)與友元運(yùn)算符重載)環(huán)境中調(diào)試該程序,這時(shí)會(huì)出現(xiàn)與友元運(yùn)算符重載函數(shù)有關(guān)的編譯錯(cuò)誤函數(shù)有關(guān)的編譯錯(cuò)誤“不能訪問類的私有成員不能訪問類的私有成員”。即所聲明的友元函。即所聲明的友元函數(shù)不為編譯器數(shù)不為編譯器“認(rèn)可認(rèn)可”。為了消除為了消除VC6.0中的這種問題,將中的這種問題,將Person.h文件中的語句文件中的語句#include using namespace std;修改成為:修改成為:#include #include 將將main函數(shù)所在文件中的語句函數(shù)所在文件中的語句#include using n
16、amespace std;修改成為:修改成為: #include 程序在程序在Visual C+6.0編譯環(huán)境下可以正常編譯。編譯環(huán)境下可以正常編譯。 235.成員運(yùn)算符函數(shù)和成員運(yùn)算符函數(shù)和友員運(yùn)算符函數(shù)的比較友員運(yùn)算符函數(shù)的比較 對(duì)于雙目運(yùn)算符而言,成員運(yùn)算符函數(shù)帶有對(duì)于雙目運(yùn)算符而言,成員運(yùn)算符函數(shù)帶有一個(gè)參數(shù),而友元運(yùn)算符函數(shù)帶有兩個(gè)參數(shù);一個(gè)參數(shù),而友元運(yùn)算符函數(shù)帶有兩個(gè)參數(shù);雙目運(yùn)算符一般可以被重載為成員運(yùn)算符函雙目運(yùn)算符一般可以被重載為成員運(yùn)算符函數(shù)或友元運(yùn)算符函數(shù),但一種情況(一般數(shù)數(shù)或友元運(yùn)算符函數(shù),但一種情況(一般數(shù)據(jù)類型據(jù)類型+ +對(duì)象)必須用友元運(yùn)算符函數(shù)。對(duì)象)必須用
17、友元運(yùn)算符函數(shù)。 24可以聲明為成員運(yùn)可以聲明為成員運(yùn)算符函數(shù)算符函數(shù)#include class nclass int x,y; public: nclass ( int i = 0 , int j = 0 ) x = i ; y = j ; void show() cout x “,” y endl ; friend nclass operator + ( nclass ob, int m) ; friend nclass operator + ( int m , nclass ob ) ; ;nclass operator +( nclass ob, point m) nclass w;
18、 w.x=ob.x+m; w.y=ob.y+m; return w ;nclass operator +( point m ,nclass ob) nclass w ; w.x= m +ob.x ; w.y=m + ob.y ; return w ;不可以聲明為成員不可以聲明為成員運(yùn)算符函數(shù)運(yùn)算符函數(shù)25void main() nclass ob1(10,20),ob2; ob2=ob1+30; /隱式調(diào)用隱式調(diào)用 ob2.show(); ob2= operator +( ob1, 30); /顯式調(diào)用顯式調(diào)用 ob2=50+ob1; /隱式調(diào)用隱式調(diào)用 ob2.show(); ob2= op
19、erator +( 50, ob1); /顯式調(diào)用顯式調(diào)用26分析分析ob=ob+200;由于對(duì)象由于對(duì)象ob是運(yùn)算符是運(yùn)算符“+”的左操作數(shù),所以的左操作數(shù),所以它調(diào)用了它調(diào)用了“+”運(yùn)算符重載函數(shù);運(yùn)算符重載函數(shù);ob=300+ob;未能工作的原因是運(yùn)算符的左操作數(shù)是一個(gè)整未能工作的原因是運(yùn)算符的左操作數(shù)是一個(gè)整數(shù),整數(shù)是內(nèi)部數(shù)據(jù)類型,它不能產(chǎn)生對(duì)一數(shù),整數(shù)是內(nèi)部數(shù)據(jù)類型,它不能產(chǎn)生對(duì)一個(gè)類成員函數(shù)的調(diào)用。個(gè)類成員函數(shù)的調(diào)用。27解決方法解決方法使用友元函數(shù)來重載運(yùn)算符使用友元函數(shù)來重載運(yùn)算符“+”,就能消除由就能消除由于運(yùn)算符于運(yùn)算符“+”的左操作數(shù)是內(nèi)部數(shù)據(jù)類型而的左操作數(shù)是內(nèi)部數(shù)據(jù)類
20、型而帶來的問題。帶來的問題。這樣這樣,兩個(gè)參數(shù)都顯式地傳遞給運(yùn)算符函數(shù)。兩個(gè)參數(shù)都顯式地傳遞給運(yùn)算符函數(shù)。結(jié)論:用友元運(yùn)算符函數(shù)來重載運(yùn)算符結(jié)論:用友元運(yùn)算符函數(shù)來重載運(yùn)算符“+”(或其他雙目運(yùn)算符)就使得內(nèi)部數(shù)據(jù)類型(或其他雙目運(yùn)算符)就使得內(nèi)部數(shù)據(jù)類型能夠出現(xiàn)在運(yùn)算符的左邊。能夠出現(xiàn)在運(yùn)算符的左邊。28說明說明C+的大部分運(yùn)算符既可以被重載為成員運(yùn)算符函的大部分運(yùn)算符既可以被重載為成員運(yùn)算符函數(shù)也可以被重載為友元運(yùn)算符函數(shù)。數(shù)也可以被重載為友元運(yùn)算符函數(shù)。友元算符函數(shù)可增加重載運(yùn)算符的靈活性。成員友元算符函數(shù)可增加重載運(yùn)算符的靈活性。成員函數(shù)重載運(yùn)算符可以最大程度地保持程序的封裝函數(shù)重載運(yùn)
21、算符可以最大程度地保持程序的封裝性。性。一般說來,對(duì)于一目運(yùn)算符用成員函數(shù)重載較好,一般說來,對(duì)于一目運(yùn)算符用成員函數(shù)重載較好,對(duì)于二目算符用友元算符函數(shù)重載恰當(dāng)。對(duì)于二目算符用友元算符函數(shù)重載恰當(dāng)。 29如果一個(gè)運(yùn)算符的操作需要修改類對(duì)象的狀態(tài),如果一個(gè)運(yùn)算符的操作需要修改類對(duì)象的狀態(tài),則選擇成員運(yùn)算符函數(shù)較好;則選擇成員運(yùn)算符函數(shù)較好;如運(yùn)算符所需的操作數(shù)(第一個(gè)操作數(shù))希望有如運(yùn)算符所需的操作數(shù)(第一個(gè)操作數(shù))希望有隱式類型轉(zhuǎn)換,則必須選擇友元運(yùn)算符函數(shù)。隱式類型轉(zhuǎn)換,則必須選擇友元運(yùn)算符函數(shù)。 30【例例4-2】 通過友元運(yùn)算符重載函數(shù)實(shí)現(xiàn)字通過友元運(yùn)算符重載函數(shù)實(shí)現(xiàn)字符串常量與日期類
22、對(duì)象的比較。符串常量與日期類對(duì)象的比較。【分析分析】對(duì)于對(duì)于左操作數(shù)左操作數(shù)是基本數(shù)據(jù)類型,而是基本數(shù)據(jù)類型,而右操作右操作數(shù)數(shù)是類對(duì)象的情況,例如,將某一字符串常量是類對(duì)象的情況,例如,將某一字符串常量“1992.12.18”與某一日期類對(duì)象進(jìn)行比較,就不與某一日期類對(duì)象進(jìn)行比較,就不能使用成員運(yùn)算符重載函數(shù)來實(shí)現(xiàn),其原因在于:能使用成員運(yùn)算符重載函數(shù)來實(shí)現(xiàn),其原因在于: 這時(shí)這時(shí)左操作數(shù)不是類對(duì)象,不能調(diào)用類的成員函數(shù)左操作數(shù)不是類對(duì)象,不能調(diào)用類的成員函數(shù)。在這種情況下,需要通過友元函數(shù)來實(shí)現(xiàn)運(yùn)算符在這種情況下,需要通過友元函數(shù)來實(shí)現(xiàn)運(yùn)算符的重載。的重載。 #include #inclu
23、de class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);int GetYear();int GetMonth();int GetDay();bool operator(CDate date); friend bool operator(const char* strDate, CDate &date); ; 通過友元函數(shù)進(jìn)行比較運(yùn)算通過友元函數(shù)進(jìn)行比較運(yùn)算符符的重載的重載這里做了修改(針對(duì)這里做了修改(針對(duì)VC 6.0編譯環(huán)境)編譯環(huán)境)32bool
24、 operator(const char* strDate, CDate &date)char strYear5, strMonth3, strDay3;int nYear, nMonth, nDay;strncpy(strYear, strDate, 4); strYear4 = 0;strncpy(strMonth, strDate+5, 2);strMonth2 = 0;strncpy(strDay, strDate+8, 2);strDay2 = 0;nYear = atoi(strYear);nMonth = atoi(strMonth);nDay = atoi(strDay
25、);if(nYear date.m_nYear)return true;if(nYear = date.m_nYear) & (nMonth date.m_nMonth)return true;if(nYear = date.m_nYear) & (nMonth = date.m_nMonth) &(nDay date.m_nDay)return true;return false;33int main()CDate date1(1992, 3, 5), date2(1993, 4, 8);if(date1 date2)coutdate1的日期早于的日期早于date2e
26、ndl;elsecoutdate1的日期不早于的日期不早于date2;CDate date3(1992, 12, 29); if(1992.12.19 date3)coutdate3的日期值晚于:的日期值晚于:1992.12.19endl;elsecoutdate3的日期值不晚于:的日期值不晚于:1992.12.19endl;return 0; 調(diào)用成員運(yùn)算符重載函數(shù):調(diào)用成員運(yùn)算符重載函數(shù):bool operator(CDate date);調(diào)用友元運(yùn)算符重載函數(shù):調(diào)用友元運(yùn)算符重載函數(shù):bool operator(const char* strDate, CDate &date);
27、346. 通過類外的普通函數(shù)實(shí)現(xiàn)運(yùn)算符通過類外的普通函數(shù)實(shí)現(xiàn)運(yùn)算符的重載的重載【例4-3】重載運(yùn)算符重載運(yùn)算符“+”,實(shí)現(xiàn)復(fù)數(shù)的相加。,實(shí)現(xiàn)復(fù)數(shù)的相加。【分析分析】首先定義復(fù)數(shù)類首先定義復(fù)數(shù)類CComplex。考慮到??紤]到要使用類外的普通函數(shù)來處理復(fù)數(shù)類內(nèi)部的要使用類外的普通函數(shù)來處理復(fù)數(shù)類內(nèi)部的數(shù)據(jù),故將數(shù)據(jù)放在公有域中聲明。數(shù)據(jù),故將數(shù)據(jù)放在公有域中聲明。 這樣僅僅為了重載運(yùn)算符,明顯破壞了類的這樣僅僅為了重載運(yùn)算符,明顯破壞了類的封裝性,是很不常見的情形。因?yàn)槲覀冇懈庋b性,是很不常見的情形。因?yàn)槲覀冇懈线m的解決問題的辦法,沒有必要合適的解決問題的辦法,沒有必要“犧牲犧牲”類的封裝性
28、。類的封裝性。#include using namespace std;class CComplex public:double m_real;double m_imag;CComplex(double real = 0.0, double imag = 0.0)m_real = real;m_imag = imag;CComplex operator+(const CComplex &complex1, const CComplex &complex2)CComplex temp;temp.m_real = complex1.m_real + complex2.m_real;
29、temp.m_imag = complex1.m_imag + complex2.m_imag;return temp;int main()CComplex complex1(1.2, 2.4), complex2(3.3, 4.4), complex3, complex4;complex3 = complex1 + complex2; coutcomplex3.m_real=complex3.m_real complex3.m_imag=complex3.m_imagendl;complex4 = operator+(complex1, complex2); coutcomplex4.m_r
30、eal=complex4.m_real complex4.m_imag=complex4.m_imagendl;return 0;運(yùn)算符重載函數(shù)的隱式調(diào)用運(yùn)算符重載函數(shù)的隱式調(diào)用運(yùn)算符重載函數(shù)的顯式調(diào)用運(yùn)算符重載函數(shù)的顯式調(diào)用387. 單目運(yùn)算符的重載單目運(yùn)算符的重載“+”和和“-”w自增運(yùn)算符自增運(yùn)算符“+”和自減運(yùn)算符和自減運(yùn)算符“-”都是只都是只有一個(gè)操作數(shù)的單目運(yùn)算符。有一個(gè)操作數(shù)的單目運(yùn)算符。w下面設(shè)計(jì)一個(gè)坐標(biāo)點(diǎn)類下面設(shè)計(jì)一個(gè)坐標(biāo)點(diǎn)類CPoint,使用,使用“+”完成完成CPoint類對(duì)象的自增運(yùn)算。類對(duì)象的自增運(yùn)算?!纠?-4】使用成員運(yùn)算符重載函數(shù)實(shí)現(xiàn)使用成員運(yùn)算符重載函數(shù)實(shí)現(xiàn)
31、CPoint類的自增運(yùn)算符類的自增運(yùn)算符“+”的重載。的重載。#include using namespace std;class CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i ; m_y = j ; void show() cout m_x “,” m_y endl ; CPoint operator +( ) ;CPoint CPoint : operator +( ) +m_x; /先增量 +m_y; /先增量 return *this ; /再返回原對(duì)象“+” 運(yùn)算符的重載運(yùn)算符的重載前綴方式前綴方式v
32、oid main() CPoint point1(100, 100), point2; point1.show( ); point2 =+point1; /隱式調(diào)用,像使用基本類型一樣書寫 point2.show(); point1.operator + ( ); /顯式調(diào)用,類的成員函數(shù)調(diào)用格式 point1.show(); 運(yùn)算結(jié)果符合前綴運(yùn)算結(jié)果符合前綴方式方式前綴方式實(shí)現(xiàn)了,后前綴方式實(shí)現(xiàn)了,后綴方式怎樣實(shí)現(xiàn)?綴方式怎樣實(shí)現(xiàn)?41【例例4-4補(bǔ)充補(bǔ)充】使用成員運(yùn)算符重載函數(shù)實(shí)現(xiàn)使用成員運(yùn)算符重載函數(shù)實(shí)現(xiàn)CPoint類的自增運(yùn)算符類的自增運(yùn)算符“+”的后綴方式的重的后綴方式的重載。載?!?/p>
33、分析分析】前綴方式和后綴方式的區(qū)別在于運(yùn)算當(dāng)中,是前綴方式和后綴方式的區(qū)別在于運(yùn)算當(dāng)中,是“先先變變”還是還是“先用先用”。使用時(shí):+ point1 /前綴方式定義時(shí): point1.operator+(); /成員運(yùn)算符函數(shù)使用時(shí): point1 + /后綴方式定義時(shí): point1.operator+(); /成員運(yùn)算符函數(shù)很顯然,在一個(gè)類里面出現(xiàn)兩個(gè)完全一樣的成員函數(shù)是無法很顯然,在一個(gè)類里面出現(xiàn)兩個(gè)完全一樣的成員函數(shù)是無法區(qū)分的,那么為了區(qū)分開,在后綴方式的定義中加入一個(gè)區(qū)分的,那么為了區(qū)分開,在后綴方式的定義中加入一個(gè)參數(shù)。參數(shù)。42+和和-重載重載在在C+中,編譯器通過在運(yùn)算符函數(shù)
34、參數(shù)表中是否插中,編譯器通過在運(yùn)算符函數(shù)參數(shù)表中是否插入關(guān)鍵字入關(guān)鍵字int來區(qū)分來區(qū)分+或或- - 是前綴方式還是后綴方是前綴方式還是后綴方式。式。+ point1 /前綴方式前綴方式(前面已講)point1.operator+(); /成員運(yùn)算符函數(shù)point1 + /后綴方式后綴方式 point1.operator + ( int ); /成員運(yùn)算符函數(shù)調(diào)用時(shí),參數(shù)int一般被傳值0。 43#include using namespace std;class CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i
35、; m_y = j ; void show() cout m_x , m_y endl ; CPoint operator +(); /前綴方式前綴方式 CPoint operator +( int i); /后綴方式后綴方式;44CPoint CPoint:operator +( ) +m_x; /先增量先增量 +m_y; /先增量先增量 return *this ; /再返回原對(duì)象再返回原對(duì)象CPoint CPoint:operator +( int i) CPoint temp(*this); /先將原對(duì)象的值保存先將原對(duì)象的值保存 m_x+; m_y+; /改變?cè)瓕?duì)象改變?cè)瓕?duì)象 ret
36、urn temp; /返回原對(duì)象舊值返回原對(duì)象舊值 45void main() CPoint point1(100, 100), point2; point1.show(); /point2 =+point1; point2 = point1+; point2.show(); /point1.operator+(); point1.operator+(1); point1.show(); 46【例例4-5】基于基于CPoint類,使用友元函數(shù)重載類,使用友元函數(shù)重載前綴自增運(yùn)算符和后綴自增運(yùn)算符。前綴自增運(yùn)算符和后綴自增運(yùn)算符。#include using namespace std;clas
37、s CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i ; m_y = j ; void show() cout m_x , m_y 訪問)、訪問)、“:”、“.-”、“?:”、“.*”(成員指針逆向引用運(yùn)算符)(成員指針逆向引用運(yùn)算符)這五個(gè)運(yùn)算符不能重載,也不能創(chuàng)造新的運(yùn)算符。這五個(gè)運(yùn)算符不能重載,也不能創(chuàng)造新的運(yùn)算符。51運(yùn)算符重載時(shí)的要求運(yùn)算符重載時(shí)的要求運(yùn)算符重載時(shí),應(yīng)該滿足以下兩個(gè)條件:運(yùn)算符重載時(shí),應(yīng)該滿足以下兩個(gè)條件:不能改變運(yùn)算符的初始含義;不能改變運(yùn)算符的初始含義;不能改變運(yùn)算符的參數(shù)數(shù)目,但是可
38、以有不能改變運(yùn)算符的參數(shù)數(shù)目,但是可以有選擇地省略某個(gè)操作數(shù)。選擇地省略某個(gè)操作數(shù)。但可以實(shí)現(xiàn)運(yùn)算符重載函數(shù)的重載(為同一個(gè)但可以實(shí)現(xiàn)運(yùn)算符重載函數(shù)的重載(為同一個(gè)運(yùn)算符定義幾個(gè)運(yùn)算符重載函數(shù)來進(jìn)行不運(yùn)算符定義幾個(gè)運(yùn)算符重載函數(shù)來進(jìn)行不同的操作)同的操作)52總結(jié):運(yùn)算符重載的局限性與優(yōu)點(diǎn)總結(jié):運(yùn)算符重載的局限性與優(yōu)點(diǎn) 不能繼承;(不能聲明為虛函數(shù))不能繼承;(不能聲明為虛函數(shù))一般對(duì)象之間的運(yùn)算局限于數(shù)據(jù)成員是非指針類一般對(duì)象之間的運(yùn)算局限于數(shù)據(jù)成員是非指針類型;型;運(yùn)算符重載與相同功能的成員函數(shù)或友元函數(shù)相運(yùn)算符重載與相同功能的成員函數(shù)或友元函數(shù)相比,在隱式調(diào)用時(shí)更簡(jiǎn)潔,這是運(yùn)算符重載的最
39、比,在隱式調(diào)用時(shí)更簡(jiǎn)潔,這是運(yùn)算符重載的最明顯的優(yōu)點(diǎn)。明顯的優(yōu)點(diǎn)。 538.8.賦值運(yùn)算符賦值運(yùn)算符“= =”的重載的重載 只要是用戶定義了類或結(jié)構(gòu),都應(yīng)能進(jìn)行賦值運(yùn)算,只要是用戶定義了類或結(jié)構(gòu),都應(yīng)能進(jìn)行賦值運(yùn)算,這也是繼承了這也是繼承了C語言:語言: struct S int a , b ; ;S m , n ;m = n ; /C語言允許這樣賦值語言允許這樣賦值 54數(shù)組例外數(shù)組例外但是數(shù)組名不能賦值,一個(gè)數(shù)組名代表一個(gè)數(shù)但是數(shù)組名不能賦值,一個(gè)數(shù)組名代表一個(gè)數(shù)據(jù)類型的集合,實(shí)質(zhì)上是一個(gè)常量指針,所據(jù)類型的集合,實(shí)質(zhì)上是一個(gè)常量指針,所以它不能:以它不能: int a5;int b =
40、3, 5, 7, 9, 11 ;a = b ; /error 55拷貝構(gòu)造函數(shù)和賦值運(yùn)算符拷貝構(gòu)造函數(shù)和賦值運(yùn)算符對(duì)于任何類,像拷貝構(gòu)造函數(shù)一樣,對(duì)于任何類,像拷貝構(gòu)造函數(shù)一樣,C+C+也提供默認(rèn)也提供默認(rèn)的賦值運(yùn)算符函數(shù),但是要區(qū)別拷貝構(gòu)造函數(shù)和的賦值運(yùn)算符函數(shù),但是要區(qū)別拷貝構(gòu)造函數(shù)和賦值運(yùn)算符:賦值運(yùn)算符: void fn ( MyClass& mc ) MyClass newMC = mc ; /這是拷貝構(gòu)造函數(shù) newMC = mc ; /這是賦值運(yùn)算符56區(qū)別區(qū)別當(dāng)拷貝構(gòu)造函數(shù)執(zhí)行時(shí),當(dāng)拷貝構(gòu)造函數(shù)執(zhí)行時(shí),newMC對(duì)象還不存在,拷對(duì)象還不存在,拷貝構(gòu)造函數(shù)起初始化的作用。
41、貝構(gòu)造函數(shù)起初始化的作用。當(dāng)賦值運(yùn)算符在當(dāng)賦值運(yùn)算符在newMC上執(zhí)行時(shí),它已經(jīng)是一個(gè)上執(zhí)行時(shí),它已經(jīng)是一個(gè)MyClass對(duì)象。對(duì)象。通常,缺省的賦值運(yùn)算符函數(shù)是能夠勝任工作的。但通常,缺省的賦值運(yùn)算符函數(shù)是能夠勝任工作的。但是在某些情況下,如類中有指針類型時(shí),使用缺省是在某些情況下,如類中有指針類型時(shí),使用缺省的賦值運(yùn)算符函數(shù)會(huì)產(chǎn)生錯(cuò)誤。即存在指針懸掛的的賦值運(yùn)算符函數(shù)會(huì)產(chǎn)生錯(cuò)誤。即存在指針懸掛的問題。問題。 57補(bǔ)充例題補(bǔ)充例題#include #include class string char *ptr; public: string ( char *s ) ptr =new charstrlen(s)+1; strcpy(ptr,s); string () delete ptr ; void print () cout ptr endl ; ;void main() stri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)黑色家電行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)高速鋼鋸條行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)露營(yíng)烤架行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)防藍(lán)光平板電腦屏幕保護(hù)器行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 數(shù)學(xué)死亡題目解析及答案
- 個(gè)性化精神產(chǎn)品對(duì)社會(huì)文化和諧的促進(jìn)作用
- 2025-2030年中國(guó)裝載機(jī)和和挖掘機(jī)組合行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 數(shù)學(xué)精算題目及答案
- 街道衛(wèi)生院AI輔助診斷系統(tǒng)行業(yè)跨境出海項(xiàng)目商業(yè)計(jì)劃書
- 禮品店企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 福建高考名著《紅樓夢(mèng)》填空題+答案
- 商標(biāo)法期末復(fù)習(xí)
- 材料力學(xué)計(jì)算試題(庫)完整
- 投資控股集團(tuán)有限公司安全生產(chǎn)責(zé)任制暫行辦法
- NGW型行星齒輪傳動(dòng)系統(tǒng)的優(yōu)化設(shè)計(jì)
- 三年級(jí)上冊(cè)數(shù)學(xué)教案-第七單元 分?jǐn)?shù)的初步認(rèn)識(shí) 蘇教版
- 2019第五版新版PFMEA 注塑實(shí)例
- 航線代碼及中英文船名查詢
- 輸電線路通道危險(xiǎn)源值守通道巡視服務(wù)
- 普氏巖石硬度系數(shù)知識(shí)1
- 提高斜拉索梁端錨固鋼套管軸線定位精度
評(píng)論
0/150
提交評(píng)論