第6講的多態(tài)性_第1頁
第6講的多態(tài)性_第2頁
第6講的多態(tài)性_第3頁
第6講的多態(tài)性_第4頁
第6講的多態(tài)性_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第6 6講講 多態(tài)性多態(tài)性(2)(2)2本講主要內(nèi)容本講主要內(nèi)容什么是多態(tài)性什么是多態(tài)性應(yīng)用虛函數(shù)實現(xiàn)多態(tài)性應(yīng)用虛函數(shù)實現(xiàn)多態(tài)性純虛函數(shù)與抽象類純虛函數(shù)與抽象類創(chuàng)建和調(diào)用運算符函數(shù)創(chuàng)建和調(diào)用運算符函數(shù)3創(chuàng)建和調(diào)用運算符函數(shù)創(chuàng)建和調(diào)用運算符函數(shù)41.運算符重載的需要性運算符重載的需要性 C+認為認為用戶定義的數(shù)據(jù)類型用戶定義的數(shù)據(jù)類型就像就像基本數(shù)據(jù)類型基本數(shù)據(jù)類型int和和char一樣有效。一樣有效。運算符運算符(如(如+、-、*、/)是為基本數(shù)據(jù)類型定義的,)是為基本數(shù)據(jù)類型定義的,為什么不允許為什么不允許用于用于用戶自己定義的類型呢?用戶自己定義的類型呢? 5例如:例如:class A

2、public : A ( int x ) a = x ; /.;A a ( 5 ) , b ( 10 ) , c ;c = a + b ; /類對象也應(yīng)能運算類對象也應(yīng)能運算 62. 怎樣進行運算符重載怎樣進行運算符重載運算符運算符是在是在C+系統(tǒng)內(nèi)部定義的,系統(tǒng)內(nèi)部定義的,具有特定的具有特定的語法規(guī)則,如參數(shù)說明,運算順序,優(yōu)先級語法規(guī)則,如參數(shù)說明,運算順序,優(yōu)先級別別等。等。重載運算符時,要注意該重載運算符的運算順重載運算符時,要注意該重載運算符的運算順序和優(yōu)先級別不變。序和優(yōu)先級別不變。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運算符重載運算符重載 “語法修飾語法修飾”有了運算符,編程就顯得方便。例如,對于直有了運算符,編程就顯得方便。例如,對于直角三角形斜邊長度公式角三角形斜邊長度公式c = ,用函數(shù)用函數(shù)化的格式表示:化的格式表示: c = sqrt ( add ( mult ( a , a ) , mult ( b , b ) )

4、 ) ;用運算符的格式表示:用運算符的格式表示: c = sqrt ( a * a + b * b ) ;22ba 9重載的形式重載的形式運算符是函數(shù)運算符是函數(shù),除了運算順序和優(yōu)先級別不能,除了運算順序和優(yōu)先級別不能更改外,參數(shù)和返回類型是可以重新說明的,更改外,參數(shù)和返回類型是可以重新說明的,即可以重載。即可以重載。重載的形式是:重載的形式是: 返回類型返回類型 operator 運算符號(參數(shù)說明);運算符號(參數(shù)說明);10例如:例如: A類對象的加法:類對象的加法:class A ;int operator + ( A& , A& ) ; /兩個兩個A A類對象參加運

5、算,返回類對象參加運算,返回intint型值型值 11運算符重載的方式運算符重載的方式運算符重載是通過建立運算符函數(shù)運算符重載是通過建立運算符函數(shù)operator()來實現(xiàn)來實現(xiàn)的。的。運算符函數(shù)運算符函數(shù)operator( )定義了重載的運算符將要進定義了重載的運算符將要進行的操作,行的操作,這種操作通常作用在一個類上這種操作通常作用在一個類上。運算符函數(shù)通常有兩種:運算符函數(shù)通常有兩種:類成員運算符函數(shù)類成員運算符函數(shù)類的友元運算符函數(shù)類的友元運算符函數(shù)講義上還介紹了運算符的重載第三種方式:講義上還介紹了運算符的重載第三種方式:作為類外的普通函數(shù)(很少使用)作為類外的普通函數(shù)(很少使用)1

6、23. 建立類成員運算符函數(shù)建立類成員運算符函數(shù)成員運算符函數(shù)的一般聲明格式:成員運算符函數(shù)的一般聲明格式:class A /. 返回值類型返回值類型 operator C+運算符運算符(參數(shù)表參數(shù)表); /.;返回值類型返回值類型 類名類名:operator C+運算符運算符(參數(shù)表參數(shù)表) 定義將要重載的定義將要重載的C+運算符的操作運算符的操作 13通過成員函數(shù)實現(xiàn)運算符的重載通過成員函數(shù)實現(xiàn)運算符的重載【例4-1】 通過重載運算符通過重載運算符“”,實現(xiàn)日期類對象,實現(xiàn)日期類對象的的“”比較運算。比較運算。說明:本例以成員函數(shù)的方式進行運算符說明:本例以成員函數(shù)的方式進行運算符“”的重

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);比較運算符比較運算符“”的重載的重載關(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; 運算符函數(shù)的隱式調(diào)用。也可以寫成:運算符函數(shù)的隱式調(diào)用。也可以寫成:if(date1.operator(date2) /顯式調(diào)用顯式調(diào)用date1是左操作數(shù)是左操作數(shù)

10、 date2是右操作數(shù)是右操作數(shù)比較運算是雙目運算,比較運算是雙目運算,為什么只有一個參數(shù)?為什么只有一個參數(shù)?請思考。請思考。因為成員運算符函數(shù),參數(shù)中隱含的有一個因為成員運算符函數(shù),參數(shù)中隱含的有一個thisthis指針,所以對于雙目算符,類成員運算符函數(shù)有指針,所以對于雙目算符,類成員運算符函數(shù)有一個參數(shù)。一個參數(shù)。當成員函數(shù)重載雙目算符時,有一個參數(shù)沒有被當成員函數(shù)重載雙目算符時,有一個參數(shù)沒有被顯式地傳遞給成員運算符函數(shù)顯式地傳遞給成員運算符函數(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)用時:調(diào)用時:if (date1 date2) 相當于:相當于:if(date1.operator(date2)并相當于:并相當于:if(date1.operator(&date1,date2)194. 建立友元運算符函數(shù)建立友元運算符函數(shù) 友元運算符函數(shù)的聲明格式:友元運算符函數(shù)的聲明格式:class A / friend

13、返回值類型返回值類型 operator c+運算符運算符(參數(shù)表參數(shù)表);返回值類型返回值類型 operator c+運算符運算符(參數(shù)表參數(shù)表) 定義將要重載的定義將要重載的c+運算符的操作運算符的操作 20通過友元函數(shù)實現(xiàn)運算符的重載通過友元函數(shù)實現(xiàn)運算符的重載【例4-1補充】 通過重載運算符通過重載運算符“”,實現(xiàn)日期類,實現(xiàn)日期類對象的對象的“”比較運算。比較運算。說明:本例以友元函數(shù)的方式進行運算符說明:本例以友元函數(shù)的方式進行運算符“”的重的重載。載。/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)試該程序,這時會出現(xiàn)與友元運算符重載)環(huán)境中調(diào)試該程序,這時會出現(xiàn)與友元運算符重載函數(shù)有關(guān)的編譯錯誤函數(shù)有關(guān)的編譯錯誤“不能訪問類的私有成員不能訪問類的私有成員”。即所聲明的友元函。即所聲明的友元函數(shù)不為編譯器數(shù)不為編譯器“認可認可”。為了消除為了消除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.成員運算符函數(shù)和成員運算符函數(shù)和友員運算符函數(shù)的比較友員運算符函數(shù)的比較 對于雙目運算符而言,成員運算符函數(shù)帶有對于雙目運算符而言,成員運算符函數(shù)帶有一個參數(shù),而友元運算符函數(shù)帶有兩個參數(shù);一個參數(shù),而友元運算符函數(shù)帶有兩個參數(shù);雙目運算符一般可以被重載為成員運算符函雙目運算符一般可以被重載為成員運算符函數(shù)或友元運算符函數(shù),但一種情況(一般數(shù)數(shù)或友元運算符函數(shù),但一種情況(一般數(shù)據(jù)類型據(jù)類型+ +對象)必須用友元運算符函數(shù)。對象)必須用

17、友元運算符函數(shù)。 24可以聲明為成員運可以聲明為成員運算符函數(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 ;不可以聲明為成員不可以聲明為成員運算符函數(shù)運算符函數(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;由于對象由于對象ob是運算符是運算符“+”的左操作數(shù),所以的左操作數(shù),所以它調(diào)用了它調(diào)用了“+”運算符重載函數(shù);運算符重載函數(shù);ob=300+ob;未能工作的原因是運算符的左操作數(shù)是一個整未能工作的原因是運算符的左操作數(shù)是一個整數(shù),整數(shù)是內(nèi)部數(shù)據(jù)類型,它不能產(chǎn)生對一數(shù),整數(shù)是內(nèi)部數(shù)據(jù)類型,它不能產(chǎn)生對一個類成員函數(shù)的調(diào)用。個類成員函數(shù)的調(diào)用。27解決方法解決方法使用友元函數(shù)來重載運算符使用友元函數(shù)來重載運算符“+”,就能消除由就能消除由于運算符于運算符“+”的左操作數(shù)是內(nèi)部數(shù)據(jù)類型而的左操作數(shù)是內(nèi)部數(shù)據(jù)類

20、型而帶來的問題。帶來的問題。這樣這樣,兩個參數(shù)都顯式地傳遞給運算符函數(shù)。兩個參數(shù)都顯式地傳遞給運算符函數(shù)。結(jié)論:用友元運算符函數(shù)來重載運算符結(jié)論:用友元運算符函數(shù)來重載運算符“+”(或其他雙目運算符)就使得內(nèi)部數(shù)據(jù)類型(或其他雙目運算符)就使得內(nèi)部數(shù)據(jù)類型能夠出現(xiàn)在運算符的左邊。能夠出現(xiàn)在運算符的左邊。28說明說明C+的大部分運算符既可以被重載為成員運算符函的大部分運算符既可以被重載為成員運算符函數(shù)也可以被重載為友元運算符函數(shù)。數(shù)也可以被重載為友元運算符函數(shù)。友元算符函數(shù)可增加重載運算符的靈活性。成員友元算符函數(shù)可增加重載運算符的靈活性。成員函數(shù)重載運算符可以最大程度地保持程序的封裝函數(shù)重載運

21、算符可以最大程度地保持程序的封裝性。性。一般說來,對于一目運算符用成員函數(shù)重載較好,一般說來,對于一目運算符用成員函數(shù)重載較好,對于二目算符用友元算符函數(shù)重載恰當。對于二目算符用友元算符函數(shù)重載恰當。 29如果一個運算符的操作需要修改類對象的狀態(tài),如果一個運算符的操作需要修改類對象的狀態(tài),則選擇成員運算符函數(shù)較好;則選擇成員運算符函數(shù)較好;如運算符所需的操作數(shù)(第一個操作數(shù))希望有如運算符所需的操作數(shù)(第一個操作數(shù))希望有隱式類型轉(zhuǎn)換,則必須選擇友元運算符函數(shù)。隱式類型轉(zhuǎn)換,則必須選擇友元運算符函數(shù)。 30【例例4-2】 通過友元運算符重載函數(shù)實現(xiàn)字通過友元運算符重載函數(shù)實現(xiàn)字符串常量與日期類

22、對象的比較。符串常量與日期類對象的比較?!痉治龇治觥繉τ趯τ谧蟛僮鲾?shù)左操作數(shù)是基本數(shù)據(jù)類型,而是基本數(shù)據(jù)類型,而右操作右操作數(shù)數(shù)是類對象的情況,例如,將某一字符串常量是類對象的情況,例如,將某一字符串常量“1992.12.18”與某一日期類對象進行比較,就不與某一日期類對象進行比較,就不能使用成員運算符重載函數(shù)來實現(xiàn),其原因在于:能使用成員運算符重載函數(shù)來實現(xiàn),其原因在于: 這時這時左操作數(shù)不是類對象,不能調(diào)用類的成員函數(shù)左操作數(shù)不是類對象,不能調(diào)用類的成員函數(shù)。在這種情況下,需要通過友元函數(shù)來實現(xiàn)運算符在這種情況下,需要通過友元函數(shù)來實現(xià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ù)進行比較運算通過友元函數(shù)進行比較運算符符的重載的重載這里做了修改(針對這里做了修改(針對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)用成員運算符重載函數(shù):調(diào)用成員運算符重載函數(shù):bool operator(CDate date);調(diào)用友元運算符重載函數(shù):調(diào)用友元運算符重載函數(shù):bool operator(const char* strDate, CDate &date);

27、346. 通過類外的普通函數(shù)實現(xiàn)運算符通過類外的普通函數(shù)實現(xiàn)運算符的重載的重載【例4-3】重載運算符重載運算符“+”,實現(xiàn)復數(shù)的相加。,實現(xiàn)復數(shù)的相加?!痉治龇治觥渴紫榷x復數(shù)類首先定義復數(shù)類CComplex??紤]到??紤]到要使用類外的普通函數(shù)來處理復數(shù)類內(nèi)部的要使用類外的普通函數(shù)來處理復數(shù)類內(nèi)部的數(shù)據(jù),故將數(shù)據(jù)放在公有域中聲明。數(shù)據(jù),故將數(shù)據(jù)放在公有域中聲明。 這樣僅僅為了重載運算符,明顯破壞了類的這樣僅僅為了重載運算符,明顯破壞了類的封裝性,是很不常見的情形。因為我們有更封裝性,是很不常見的情形。因為我們有更合適的解決問題的辦法,沒有必要合適的解決問題的辦法,沒有必要“犧牲犧牲”類的封裝性

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;運算符重載函數(shù)的隱式調(diào)用運算符重載函數(shù)的隱式調(diào)用運算符重載函數(shù)的顯式調(diào)用運算符重載函數(shù)的顯式調(diào)用387. 單目運算符的重載單目運算符的重載“+”和和“-”w自增運算符自增運算符“+”和自減運算符和自減運算符“-”都是只都是只有一個操作數(shù)的單目運算符。有一個操作數(shù)的單目運算符。w下面設(shè)計一個坐標點類下面設(shè)計一個坐標點類CPoint,使用,使用“+”完成完成CPoint類對象的自增運算。類對象的自增運算?!纠?-4】使用成員運算符重載函數(shù)實現(xiàn)使用成員運算符重載函數(shù)實現(xiàn)

31、CPoint類的自增運算符類的自增運算符“+”的重載。的重載。#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 ; /再返回原對象“+” 運算符的重載運算符的重載前綴方式前綴方式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(); 運算結(jié)果符合前綴運算結(jié)果符合前綴方式方式前綴方式實現(xiàn)了,后前綴方式實現(xiàn)了,后綴方式怎樣實現(xiàn)?綴方式怎樣實現(xiàn)?41【例例4-4補充補充】使用成員運算符重載函數(shù)實現(xiàn)使用成員運算符重載函數(shù)實現(xiàn)CPoint類的自增運算符類的自增運算符“+”的后綴方式的重的后綴方式的重載。載。【

33、分析分析】前綴方式和后綴方式的區(qū)別在于運算當中,是前綴方式和后綴方式的區(qū)別在于運算當中,是“先先變變”還是還是“先用先用”。使用時:+ point1 /前綴方式定義時: point1.operator+(); /成員運算符函數(shù)使用時: point1 + /后綴方式定義時: point1.operator+(); /成員運算符函數(shù)很顯然,在一個類里面出現(xiàn)兩個完全一樣的成員函數(shù)是無法很顯然,在一個類里面出現(xiàn)兩個完全一樣的成員函數(shù)是無法區(qū)分的,那么為了區(qū)分開,在后綴方式的定義中加入一個區(qū)分的,那么為了區(qū)分開,在后綴方式的定義中加入一個參數(shù)。參數(shù)。42+和和-重載重載在在C+中,編譯器通過在運算符函數(shù)

34、參數(shù)表中是否插中,編譯器通過在運算符函數(shù)參數(shù)表中是否插入關(guān)鍵字入關(guān)鍵字int來區(qū)分來區(qū)分+或或- - 是前綴方式還是后綴方是前綴方式還是后綴方式。式。+ point1 /前綴方式前綴方式(前面已講)point1.operator+(); /成員運算符函數(shù)point1 + /后綴方式后綴方式 point1.operator + ( int ); /成員運算符函數(shù)調(diào)用時,參數(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 ; /再返回原對象再返回原對象CPoint CPoint:operator +( int i) CPoint temp(*this); /先將原對象的值保存先將原對象的值保存 m_x+; m_y+; /改變原對象改變原對象 ret

36、urn temp; /返回原對象舊值返回原對象舊值 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ù)重載前綴自增運算符和后綴自增運算符。前綴自增運算符和后綴自增運算符。#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 訪問)、訪問)、“:”、“.-”、“?:”、“.*”(成員指針逆向引用運算符)(成員指針逆向引用運算符)這五個運算符不能重載,也不能創(chuàng)造新的運算符。這五個運算符不能重載,也不能創(chuàng)造新的運算符。51運算符重載時的要求運算符重載時的要求運算符重載時,應(yīng)該滿足以下兩個條件:運算符重載時,應(yīng)該滿足以下兩個條件:不能改變運算符的初始含義;不能改變運算符的初始含義;不能改變運算符的參數(shù)數(shù)目,但是可

38、以有不能改變運算符的參數(shù)數(shù)目,但是可以有選擇地省略某個操作數(shù)。選擇地省略某個操作數(shù)。但可以實現(xiàn)運算符重載函數(shù)的重載(為同一個但可以實現(xiàn)運算符重載函數(shù)的重載(為同一個運算符定義幾個運算符重載函數(shù)來進行不運算符定義幾個運算符重載函數(shù)來進行不同的操作)同的操作)52總結(jié):運算符重載的局限性與優(yōu)點總結(jié):運算符重載的局限性與優(yōu)點 不能繼承;(不能聲明為虛函數(shù))不能繼承;(不能聲明為虛函數(shù))一般對象之間的運算局限于數(shù)據(jù)成員是非指針類一般對象之間的運算局限于數(shù)據(jù)成員是非指針類型;型;運算符重載與相同功能的成員函數(shù)或友元函數(shù)相運算符重載與相同功能的成員函數(shù)或友元函數(shù)相比,在隱式調(diào)用時更簡潔,這是運算符重載的最

39、比,在隱式調(diào)用時更簡潔,這是運算符重載的最明顯的優(yōu)點。明顯的優(yōu)點。 538.8.賦值運算符賦值運算符“= =”的重載的重載 只要是用戶定義了類或結(jié)構(gòu),都應(yīng)能進行賦值運算,只要是用戶定義了類或結(jié)構(gòu),都應(yīng)能進行賦值運算,這也是繼承了這也是繼承了C語言:語言: struct S int a , b ; ;S m , n ;m = n ; /C語言允許這樣賦值語言允許這樣賦值 54數(shù)組例外數(shù)組例外但是數(shù)組名不能賦值,一個數(shù)組名代表一個數(shù)但是數(shù)組名不能賦值,一個數(shù)組名代表一個數(shù)據(jù)類型的集合,實質(zhì)上是一個常量指針,所據(jù)類型的集合,實質(zhì)上是一個常量指針,所以它不能:以它不能: int a5;int b =

40、3, 5, 7, 9, 11 ;a = b ; /error 55拷貝構(gòu)造函數(shù)和賦值運算符拷貝構(gòu)造函數(shù)和賦值運算符對于任何類,像拷貝構(gòu)造函數(shù)一樣,對于任何類,像拷貝構(gòu)造函數(shù)一樣,C+C+也提供默認也提供默認的賦值運算符函數(shù),但是要區(qū)別拷貝構(gòu)造函數(shù)和的賦值運算符函數(shù),但是要區(qū)別拷貝構(gòu)造函數(shù)和賦值運算符:賦值運算符: void fn ( MyClass& mc ) MyClass newMC = mc ; /這是拷貝構(gòu)造函數(shù) newMC = mc ; /這是賦值運算符56區(qū)別區(qū)別當拷貝構(gòu)造函數(shù)執(zhí)行時,當拷貝構(gòu)造函數(shù)執(zhí)行時,newMC對象還不存在,拷對象還不存在,拷貝構(gòu)造函數(shù)起初始化的作用。

41、貝構(gòu)造函數(shù)起初始化的作用。當賦值運算符在當賦值運算符在newMC上執(zhí)行時,它已經(jīng)是一個上執(zhí)行時,它已經(jīng)是一個MyClass對象。對象。通常,缺省的賦值運算符函數(shù)是能夠勝任工作的。但通常,缺省的賦值運算符函數(shù)是能夠勝任工作的。但是在某些情況下,如類中有指針類型時,使用缺省是在某些情況下,如類中有指針類型時,使用缺省的賦值運算符函數(shù)會產(chǎn)生錯誤。即存在指針懸掛的的賦值運算符函數(shù)會產(chǎn)生錯誤。即存在指針懸掛的問題。問題。 57補充例題補充例題#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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論