第11章運(yùn)算符重載ppt課件_第1頁(yè)
第11章運(yùn)算符重載ppt課件_第2頁(yè)
第11章運(yùn)算符重載ppt課件_第3頁(yè)
第11章運(yùn)算符重載ppt課件_第4頁(yè)
第11章運(yùn)算符重載ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 1v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的方法 v幾個(gè)特殊的運(yùn)算符的重載幾個(gè)特殊的運(yùn)算符的重載 v自定義類(lèi)型轉(zhuǎn)換運(yùn)算符自定義類(lèi)型轉(zhuǎn)換運(yùn)算符v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 2v使系統(tǒng)內(nèi)置的運(yùn)算符可以用于類(lèi)類(lèi)型使系統(tǒng)內(nèi)置的運(yùn)算符可以用于類(lèi)類(lèi)型v例如:例如:+ + 運(yùn)算符能夠?qū)崿F(xiàn)運(yùn)算符能夠?qū)崿F(xiàn)2 2個(gè)對(duì)象間的個(gè)對(duì)象間的加。例如:類(lèi)加。例如:類(lèi)a a的對(duì)象的對(duì)象a1a1、a2a2、a3a3,希,希望:望: a3 = a1 + a2a3 = a1 + a2; 即:分別把對(duì)象即

2、:分別把對(duì)象a1a1和和a2a2的各個(gè)數(shù)據(jù)成員的各個(gè)數(shù)據(jù)成員值對(duì)應(yīng)相加,然后賦給對(duì)象值對(duì)應(yīng)相加,然后賦給對(duì)象a3a3。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 3v把某些事交給系統(tǒng)去做,用戶(hù)只要知道把某些事交給系統(tǒng)去做,用戶(hù)只要知道相加就可相加就可v擴(kuò)充運(yùn)算符的功能擴(kuò)充運(yùn)算符的功能v增強(qiáng)了增強(qiáng)了c+ c+ 語(yǔ)言的可擴(kuò)充性語(yǔ)言的可擴(kuò)充性v使用戶(hù)定義的類(lèi)更像系統(tǒng)的內(nèi)置類(lèi)型使用戶(hù)定義的類(lèi)更像系統(tǒng)的內(nèi)置類(lèi)型程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 4v不是所有的運(yùn)算符都能重載不是所有的運(yùn)算符都能重載v重載不能改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性重載不能改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性v重載不能改變

3、運(yùn)算符的操作數(shù)個(gè)數(shù)重載不能改變運(yùn)算符的操作數(shù)個(gè)數(shù)v不能創(chuàng)建新的運(yùn)算符不能創(chuàng)建新的運(yùn)算符程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 5 + - * / % & | ! = += -= *= /= %= = &= |= = = = != = & | + - -* , - () new delete new delete程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 6 . .* : ?: sizeof 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 7v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的方法 v幾個(gè)特殊的運(yùn)算符的重載幾個(gè)特殊的運(yùn)算符的重載 v自定義類(lèi)型

4、轉(zhuǎn)換運(yùn)算符自定義類(lèi)型轉(zhuǎn)換運(yùn)算符v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 8v運(yùn)算符重載就是寫(xiě)一個(gè)函數(shù)解釋某個(gè)運(yùn)算符運(yùn)算符重載就是寫(xiě)一個(gè)函數(shù)解釋某個(gè)運(yùn)算符在某個(gè)類(lèi)中的含義在某個(gè)類(lèi)中的含義v要使得系統(tǒng)能自動(dòng)找到重載的這個(gè)函數(shù),函要使得系統(tǒng)能自動(dòng)找到重載的這個(gè)函數(shù),函數(shù)名必須要體現(xiàn)出和某個(gè)被重載的運(yùn)算符的數(shù)名必須要體現(xiàn)出和某個(gè)被重載的運(yùn)算符的聯(lián)系。聯(lián)系。vc+中規(guī)定,重載函數(shù)名為中規(guī)定,重載函數(shù)名為 operator 其中,其中,為要重載的運(yùn)算符。如要重載為要重載的運(yùn)算符。如要重載“+”運(yùn)算符,該重載函數(shù)名為運(yùn)算符,該重載函數(shù)名為operator+。要重載。

5、要重載賦值運(yùn)算符,函數(shù)名為賦值運(yùn)算符,函數(shù)名為operator=。 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 9v運(yùn)算符的重載不能改變運(yùn)算符的運(yùn)算對(duì)象數(shù)。因此,重載運(yùn)算符的重載不能改變運(yùn)算符的運(yùn)算對(duì)象數(shù)。因此,重載函數(shù)的形式參數(shù)個(gè)數(shù)(包括成員函數(shù)的隱式指針函數(shù)的形式參數(shù)個(gè)數(shù)(包括成員函數(shù)的隱式指針this)與運(yùn))與運(yùn)算符的運(yùn)算對(duì)象數(shù)相同算符的運(yùn)算對(duì)象數(shù)相同 v運(yùn)算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實(shí)運(yùn)算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實(shí)現(xiàn)。重載成全局函數(shù)時(shí),最好把此函數(shù)設(shè)為友員函數(shù)現(xiàn)。重載成全局函數(shù)時(shí),最好把此函數(shù)設(shè)為友員函數(shù)v如果作為類(lèi)的成員函數(shù),它的形式參數(shù)

6、個(gè)數(shù)比運(yùn)算符的運(yùn)如果作為類(lèi)的成員函數(shù),它的形式參數(shù)個(gè)數(shù)比運(yùn)算符的運(yùn)算對(duì)象數(shù)少算對(duì)象數(shù)少1。這是因?yàn)槌蓡T函數(shù)有一個(gè)隱含的參數(shù)。這是因?yàn)槌蓡T函數(shù)有一個(gè)隱含的參數(shù)this。在在c+中,把隱含參數(shù)中,把隱含參數(shù)this作為運(yùn)算符的第一個(gè)參數(shù)。作為運(yùn)算符的第一個(gè)參數(shù)。v當(dāng)把一個(gè)一元運(yùn)算符重載成成員函數(shù)時(shí),該函數(shù)沒(méi)有形式當(dāng)把一個(gè)一元運(yùn)算符重載成成員函數(shù)時(shí),該函數(shù)沒(méi)有形式參數(shù)。參數(shù)。v把一個(gè)二元運(yùn)算符重載成成員函數(shù)時(shí),該函數(shù)只有一個(gè)形把一個(gè)二元運(yùn)算符重載成成員函數(shù)時(shí),該函數(shù)只有一個(gè)形式參數(shù),就是右操作數(shù),當(dāng)前對(duì)象是左操作數(shù)。式參數(shù),就是右操作數(shù),當(dāng)前對(duì)象是左操作數(shù)。程序設(shè)計(jì) cs.sjtu 2011.9程序

7、設(shè)計(jì) - 10v為為rational類(lèi)增加類(lèi)增加“+”和和“*”以及比較以及比較的重載函數(shù),用以替換現(xiàn)有的的重載函數(shù),用以替換現(xiàn)有的add和和multi函數(shù)函數(shù) 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 11class rational private:int num;int den;void reductfraction();public:rational(int n = 0, int d = 1) num = n; den = d; rational operator+(const rational &r1) const; rational operator*(const rat

8、ional &r1) const; bool operator(const rational &r1) const; bool operator=(const rational &r1) const; bool operator!=(const rational &r1) const; void display() cout num / den; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 12rational rational:operator+(const rational &r1) const rational tmp; tmp.num = num * r1.den + r1.n

9、um * den; tmp.den = den * r1.den; tmp.reductfraction(); return tmp;rational rational:operator*(const rational &r1) const rational tmp; tmp.num = num * r1.num; tmp.den = den * r1.den; tmp.reductfraction(); return tmp; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 13bool rational:operator(const rational &r1) const return

10、 num * r1.den (const rational &r1) const return num * r1.den den * r1.num; bool rational:operator=(const rational &r1) const return num * r1.den =(const rational &r1) const return num * r1.den = den * r1.num; bool rational:operator!=(const rational &r1) const return !(*this = r1);程序設(shè)計(jì) cs.sjtu 2011.9

11、程序設(shè)計(jì) - 14class rational friend rational operator+(const rational &r1, const rational &r2); friend rational operator*(const rational &r1 , const rational &r2); friend bool operator(const rational &r1 , const rational &r2) ; friend bool operator=(const rational &r1 , const rational &r2); friend bool o

12、perator!=(const rational &r1 , const rational &r2) ; private: int num;int den;void reductfraction();public:rational(int n = 0, int d = 1) num = n; den = d;void display() cout num / den;程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 15rational operator+(const rational &r1, const rational &r2) rational tmp; tmp.num = r1.n

13、um * r2.den + r2.num * r1.den; tmp.den = r1.den * r2.den; tmp.reductfraction(); return tmp;rational operator*(const rational &r1, const rational &r2) rational tmp; tmp.num = r1.num * r2.num; tmp.den = r1.den * r2.den; tmp.reductfraction(); return tmp; 其他函數(shù)實(shí)現(xiàn)略其他函數(shù)實(shí)現(xiàn)略程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 16int ma

14、in() rational r1(1,6), r2(1,6), r3; r3 = r1 + r2; r1.display(); cout + ; r2.display(); cout = ; r3.display(); cout endl; r3 = r1 * r2; r1.display(); cout * ; r2.display(); cout = ; r3.display(); cout )必須重載成成員函數(shù)。)必須重載成成員函數(shù)。v具有賦值意義的運(yùn)算符,如復(fù)合的賦值運(yùn)算符以及具有賦值意義的運(yùn)算符,如復(fù)合的賦值運(yùn)算符以及+和和-,不一定非要定義為成員函數(shù),但最好定義為成員函數(shù),不一定非

15、要定義為成員函數(shù),但最好定義為成員函數(shù)。v具有兩個(gè)運(yùn)算對(duì)象的運(yùn)算符最好重載為全局函數(shù),這樣具有兩個(gè)運(yùn)算對(duì)象的運(yùn)算符最好重載為全局函數(shù),這樣可以使得應(yīng)用更加靈活。如果把加運(yùn)算定義成全局函數(shù)可以使得應(yīng)用更加靈活。如果把加運(yùn)算定義成全局函數(shù),r是有理數(shù)類(lèi)的對(duì)象,則是有理數(shù)類(lèi)的對(duì)象,則2+r是一個(gè)合法的表達(dá)式。是一個(gè)合法的表達(dá)式。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 18v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的方法 v幾個(gè)特殊的運(yùn)算符的重載幾個(gè)特殊的運(yùn)算符的重載 v自定義類(lèi)型轉(zhuǎn)換運(yùn)算符自定義類(lèi)型轉(zhuǎn)換運(yùn)算符v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例 程序設(shè)計(jì) cs.sjtu

16、2011.9程序設(shè)計(jì) - 19v賦值運(yùn)算符賦值運(yùn)算符 v下標(biāo)運(yùn)算符下標(biāo)運(yùn)算符v函數(shù)調(diào)用運(yùn)算符函數(shù)調(diào)用運(yùn)算符 v+和和運(yùn)算符的重載運(yùn)算符的重載 v重載函數(shù)的原型設(shè)計(jì)考慮重載函數(shù)的原型設(shè)計(jì)考慮v輸入輸出運(yùn)算符重載輸入輸出運(yùn)算符重載 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 20v對(duì)任一類(lèi),如果用戶(hù)沒(méi)有自定義賦值運(yùn)算對(duì)任一類(lèi),如果用戶(hù)沒(méi)有自定義賦值運(yùn)算符函數(shù),那么系統(tǒng)為其生成一個(gè)缺省的賦符函數(shù),那么系統(tǒng)為其生成一個(gè)缺省的賦值運(yùn)算符函數(shù),在對(duì)應(yīng)的數(shù)據(jù)成員間賦值值運(yùn)算符函數(shù),在對(duì)應(yīng)的數(shù)據(jù)成員間賦值。v一般情況下,這個(gè)缺省的賦值運(yùn)算符重載一般情況下,這個(gè)缺省的賦值運(yùn)算符重載函數(shù)能滿足用戶(hù)的需求。

17、但是,當(dāng)類(lèi)含有函數(shù)能滿足用戶(hù)的需求。但是,當(dāng)類(lèi)含有類(lèi)型為指針的數(shù)據(jù)成員時(shí),可能會(huì)帶來(lái)一類(lèi)型為指針的數(shù)據(jù)成員時(shí),可能會(huì)帶來(lái)一些麻煩。些麻煩。 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 21v會(huì)引起內(nèi)存泄漏會(huì)引起內(nèi)存泄漏v使這兩個(gè)數(shù)組的元素存放于同一塊空間中使這兩個(gè)數(shù)組的元素存放于同一塊空間中v當(dāng)這兩個(gè)對(duì)象析構(gòu)時(shí),先析構(gòu)的對(duì)象會(huì)釋當(dāng)這兩個(gè)對(duì)象析構(gòu)時(shí),先析構(gòu)的對(duì)象會(huì)釋放存儲(chǔ)數(shù)組元素的空間。而當(dāng)后一個(gè)對(duì)象放存儲(chǔ)數(shù)組元素的空間。而當(dāng)后一個(gè)對(duì)象析構(gòu)時(shí),無(wú)法釋放存放數(shù)組元素的空間析構(gòu)時(shí),無(wú)法釋放存放數(shù)組元素的空間程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 22v賦值運(yùn)算符只能重載成成員函數(shù)

18、賦值運(yùn)算符只能重載成成員函數(shù)v函數(shù)原型:函數(shù)原型: x &x:operator=(const x &source) / 賦值過(guò)程賦值過(guò)程 一旦創(chuàng)建了對(duì)象一旦創(chuàng)建了對(duì)象x1, x2, 可以用可以用 x1 = x2賦值。賦值。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 23doublearray &doublearray:operator= (const doublearray &right) if (this = &right) return *this; delete storage; low = right.low; high = right.high; storage = new

19、doublehigh - low + 1; for (int i=0; i = high - low; +i) storagei = right.storagei; /復(fù)制數(shù)組元素復(fù)制數(shù)組元素 return *this; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 24v一般來(lái)講,需要自定義拷貝構(gòu)造函數(shù)的類(lèi)也需要一般來(lái)講,需要自定義拷貝構(gòu)造函數(shù)的類(lèi)也需要自定義賦值運(yùn)算符重載函數(shù)。自定義賦值運(yùn)算符重載函數(shù)。v在賦值運(yùn)算符重載函數(shù)中,已經(jīng)將參數(shù)的值賦值在賦值運(yùn)算符重載函數(shù)中,已經(jīng)將參數(shù)的值賦值給了當(dāng)前對(duì)象,那為什么還需要返回值呢?記住給了當(dāng)前對(duì)象,那為什么還需要返回值呢?記住,在,在c+中

20、,賦值是一個(gè)運(yùn)算,它可以形成一個(gè)中,賦值是一個(gè)運(yùn)算,它可以形成一個(gè)表達(dá)式,而該表達(dá)式的結(jié)果值就是賦給左邊的對(duì)表達(dá)式,而該表達(dá)式的結(jié)果值就是賦給左邊的對(duì)象的值。因此,賦值運(yùn)算符重載函數(shù)必須返回賦象的值。因此,賦值運(yùn)算符重載函數(shù)必須返回賦給左邊的對(duì)象值。給左邊的對(duì)象值。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 25v一般來(lái)講,需要拷貝構(gòu)造函數(shù)的類(lèi)也需一般來(lái)講,需要拷貝構(gòu)造函數(shù)的類(lèi)也需要重載賦值運(yùn)算符要重載賦值運(yùn)算符v定義對(duì)象時(shí)給對(duì)象賦初值調(diào)用的是拷貝定義對(duì)象時(shí)給對(duì)象賦初值調(diào)用的是拷貝構(gòu)造函數(shù)構(gòu)造函數(shù)v程序的語(yǔ)句部分中的賦值語(yǔ)句調(diào)用的是程序的語(yǔ)句部分中的賦值語(yǔ)句調(diào)用的是賦值運(yùn)算符重載函數(shù)賦

21、值運(yùn)算符重載函數(shù)程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 26v賦值運(yùn)算符賦值運(yùn)算符 v下標(biāo)運(yùn)算符下標(biāo)運(yùn)算符v函數(shù)調(diào)用運(yùn)算符函數(shù)調(diào)用運(yùn)算符 v+和和運(yùn)算符的重載運(yùn)算符的重載 v重載函數(shù)的原型設(shè)計(jì)考慮重載函數(shù)的原型設(shè)計(jì)考慮v輸入輸出運(yùn)算符重載輸入輸出運(yùn)算符重載 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 27v能否象普通的數(shù)組那樣通過(guò)下標(biāo)運(yùn)算操作能否象普通的數(shù)組那樣通過(guò)下標(biāo)運(yùn)算操作doublearray類(lèi)的對(duì)象,這樣可以使類(lèi)的對(duì)象,這樣可以使doublearray類(lèi)更像一個(gè)功能內(nèi)置的數(shù)組。類(lèi)更像一個(gè)功能內(nèi)置的數(shù)組。v可以通過(guò)重載下標(biāo)運(yùn)算符(可以通過(guò)重載下標(biāo)運(yùn)算符()來(lái)實(shí)現(xiàn))來(lái)實(shí)

22、現(xiàn) v下標(biāo)運(yùn)算符是二元運(yùn)算符,第一個(gè)運(yùn)算數(shù)是下標(biāo)運(yùn)算符是二元運(yùn)算符,第一個(gè)運(yùn)算數(shù)是數(shù)組名,第二個(gè)運(yùn)算數(shù)是下標(biāo)值數(shù)組名,第二個(gè)運(yùn)算數(shù)是下標(biāo)值v下標(biāo)運(yùn)算符必須重載成成員函數(shù)下標(biāo)運(yùn)算符必須重載成成員函數(shù)程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 28double & doublearray:operator(int index) if (index high) cout 下標(biāo)越界下標(biāo)越界; exit(-1); return storageindex - low; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 29v定義:定義:doublearray array(20, 30);v數(shù)組輸

23、入:數(shù)組輸入: for (i=20; i=30; +i) cout 請(qǐng)輸入第請(qǐng)輸入第 i arrayi; v數(shù)組輸出:數(shù)組輸出: for (i=20; i=30; +i) cout arrayi end | start high ) cout 下標(biāo)越界下標(biāo)越界; exit(-1); doublearray tmp(lh, lh + end - start); for (int i = 0; i end - start + 1; +i) tmp.storagei = storagestart + i - low;return tmp; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 35v賦

24、值運(yùn)算符賦值運(yùn)算符 v下標(biāo)運(yùn)算符下標(biāo)運(yùn)算符v函數(shù)調(diào)用運(yùn)算符函數(shù)調(diào)用運(yùn)算符 v+和和運(yùn)算符的重載運(yùn)算符的重載 v重載函數(shù)的原型設(shè)計(jì)考慮重載函數(shù)的原型設(shè)計(jì)考慮v輸入輸出運(yùn)算符重載輸入輸出運(yùn)算符重載 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 36v、- - -:是一元操作符:是一元操作符v這兩個(gè)操作符可以是前綴,也可以是后這兩個(gè)操作符可以是前綴,也可以是后綴。而且前綴和后綴的含義是有區(qū)別的綴。而且前綴和后綴的含義是有區(qū)別的。所以,必須有兩個(gè)重載函數(shù)。所以,必須有兩個(gè)重載函數(shù)。 v問(wèn)題:兩個(gè)重載函數(shù)有相同的原型問(wèn)題:兩個(gè)重載函數(shù)有相同的原型v區(qū)分方法:區(qū)分方法: 前綴:一元操作符。前綴:一元

25、操作符。 后綴:二元操作符。后綴:二元操作符。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 37v成員函數(shù)重載成員函數(shù)重載 +ob重載為:重載為:ob.operator+() ob- 重載為:重載為:ob.operator-(int)v友元函數(shù)重載友元函數(shù)重載 +ob重載為:重載為:operator+(x &ob) ob-重載為:重載為:operator-(x &ob, int)v調(diào)用時(shí),參數(shù)調(diào)用時(shí),參數(shù)int一般傳遞給值一般傳遞給值0。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 38v設(shè)計(jì)一個(gè)會(huì)報(bào)警的計(jì)數(shù)器類(lèi)。該計(jì)數(shù)器設(shè)計(jì)一個(gè)會(huì)報(bào)警的計(jì)數(shù)器類(lèi)。該計(jì)數(shù)器從從0開(kāi)始計(jì)數(shù),當(dāng)?shù)竭_(dá)預(yù)先

26、設(shè)定好的報(bào)開(kāi)始計(jì)數(shù),當(dāng)?shù)竭_(dá)預(yù)先設(shè)定好的報(bào)警值時(shí),計(jì)數(shù)器會(huì)發(fā)出報(bào)警消息,計(jì)數(shù)警值時(shí),計(jì)數(shù)器會(huì)發(fā)出報(bào)警消息,計(jì)數(shù)器的值不再增加。器的值不再增加。 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 39class counter int value; /計(jì)數(shù)器的值計(jì)數(shù)器的值int alarm; /報(bào)警值報(bào)警值public:counter(int a) value = 0; alarm = a;counter & operator+(); /前綴的前綴的+重載重載counter operator+(int); /后綴的后綴的+重載重載void print() cout value endl; ; 程

27、序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 40counter & counter:operator+() if (value = alarm) cout 已超過(guò)報(bào)警值已超過(guò)報(bào)警值n; else +value; if (value = alarm) cout 已到達(dá)報(bào)警值已到達(dá)報(bào)警值n; return *this;counter counter:operator+(int x) counter tmp = *this; /保存對(duì)象修改前的狀態(tài)保存對(duì)象修改前的狀態(tài) if (value = alarm) cout 已超過(guò)報(bào)警值已超過(guò)報(bào)警值n; else +value; if (value =

28、 alarm) cout )()和流提取運(yùn)算符和流提取運(yùn)算符()()輸入和輸出用戶(hù)自定輸入和輸出用戶(hù)自定義類(lèi)的對(duì)象義類(lèi)的對(duì)象程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 48ostream & operator(ostream & os, const classtype &obj) os 要輸出的內(nèi)容;要輸出的內(nèi)容; return os; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 49ostream& operator(ostream &os, const rational& obj) / 輸出重載函數(shù)輸出重載函數(shù) os obj.num / obj.den; return os

29、;如定義:如定義:rational r(2,6);執(zhí)行執(zhí)行cout )()和流提取運(yùn)算符和流提取運(yùn)算符()(istream & is, classtype &obj) is 要輸入的內(nèi)容;要輸入的內(nèi)容; return is; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 52istream& operator(istream &in, rational& obj) / 輸入重載函數(shù)輸入重載函數(shù) in obj.num obj.den; obj.reductfraction(); return in;如定義:如定義:rational r;可以用可以用cin r 從鍵盤(pán)輸入從鍵盤(pán)輸入r的數(shù)據(jù)。

30、如輸入為:的數(shù)據(jù)。如輸入為:1 3執(zhí)行執(zhí)行cout (istream &in, rational& obj); friend ostream& operator(ostream &os, const rational& obj); friend rational operator+(const rational &r1, const rational &r2); friend rational operator*(const rational &r1, const rational &r2); private: int num;int den;void reductfraction();pub

31、lic:rational(int n = 0, int d = 1) num = n; den = d;operator double () const return (double(num)/den); 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 63#include #include rational.hint main() rational r1, r2, r3, r4; double x; cout r1; cout r2; r3 = r1 + r2; cout r1 + r2 = r3 endl; r3 = r1 * r2; cout r1 * r2 = r3 endl; r

32、4 = (r1 + r2) * r3; cout (r1 + r2) * r3的值為:的值為: r4 endl; x = 5.5 - r1; cout 5.5 - r1的值為:的值為: x endl; cout (r1 r2 ? r1 : r2) endl; return 0; 輸入輸入r1: 1 3輸入輸入r2: 2 61/3+1/3 = 2/31/3*1/3 = 1/9(r1 + r2) * r3的值為的值為2/275.5 - r1的值為:的值為:5.166671/3 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 64v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的

33、方法 v幾個(gè)特殊的運(yùn)算符的重載幾個(gè)特殊的運(yùn)算符的重載 v自定義類(lèi)型轉(zhuǎn)換運(yùn)算符自定義類(lèi)型轉(zhuǎn)換運(yùn)算符 v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 65v完善完善doublearray類(lèi)類(lèi)程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 66#ifndef _array_h#define _array_h#include class doublearrayfriend ostream &operator(istream &is, doublearray &obj);friend bool operator=(const doublearray &obj1, c

34、onst doublearray &obj2);private: int low; int high; double *storage;程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 67public: doublearray(int lh = 0, int rh = 0):low(lh), high(rh) storage = new double high - low + 1; doublearray(const doublearray &arr); doublearray &operator=(const doublearray &right); double & operator(

35、int index); const double & operator(int index) const; doublearray operator()(int start, int end, int lh); doublearray() delete storage; ;#endif程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 68/文件名:文件名:doublearray.cpp/doublearray類(lèi)的實(shí)現(xiàn)類(lèi)的實(shí)現(xiàn)#include #include doublearray.h“doublearray:doublearray(const doublearray &arr) low =

36、 arr.low; high = arr.high; storage = new double high - low + 1; for (int i = 0; i high -low + 1; +i) storagei = arr.storagei;程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 69doublearray &doublearray:operator= (const doublearray & a) if (this = &a) return *this; delete storage; low = a.low; high = a.high; storage = new d

37、oublehigh - low + 1; for (int i=0; i = low & index = low & index = high); return storageindex - low; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 71ostream &operator(ostream &os, const doublearray &obj) os 數(shù)組內(nèi)容為:數(shù)組內(nèi)容為:n; for (int i=obj.low; i=obj.high; +i) os obji t; os ( istream &is, doublearray &obj) cout 請(qǐng)輸入數(shù)組元素請(qǐng)輸入數(shù)組元素 obj.low , obj.high :n; for (int i=obj.low; i obji ; r

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論