![第11章運(yùn)算重載_第1頁](http://file3.renrendoc.com/fileroot3/2021-11/9/9f23829a-2e48-42af-a093-17ffde6cd6b7/9f23829a-2e48-42af-a093-17ffde6cd6b71.gif)
![第11章運(yùn)算重載_第2頁](http://file3.renrendoc.com/fileroot3/2021-11/9/9f23829a-2e48-42af-a093-17ffde6cd6b7/9f23829a-2e48-42af-a093-17ffde6cd6b72.gif)
![第11章運(yùn)算重載_第3頁](http://file3.renrendoc.com/fileroot3/2021-11/9/9f23829a-2e48-42af-a093-17ffde6cd6b7/9f23829a-2e48-42af-a093-17ffde6cd6b73.gif)
![第11章運(yùn)算重載_第4頁](http://file3.renrendoc.com/fileroot3/2021-11/9/9f23829a-2e48-42af-a093-17ffde6cd6b7/9f23829a-2e48-42af-a093-17ffde6cd6b74.gif)
![第11章運(yùn)算重載_第5頁](http://file3.renrendoc.com/fileroot3/2021-11/9/9f23829a-2e48-42af-a093-17ffde6cd6b7/9f23829a-2e48-42af-a093-17ffde6cd6b75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 1v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的方法 v幾個特殊的運(yùn)算符的重載幾個特殊的運(yùn)算符的重載 v自定義類型轉(zhuǎn)換運(yùn)算符自定義類型轉(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)算符可以用于類類型使系統(tǒng)內(nèi)置的運(yùn)算符可以用于類類型v例如:例如:+ + 運(yùn)算符能夠?qū)崿F(xiàn)運(yùn)算符能夠?qū)崿F(xiàn)2 2個對象間的個對象間的加。例如:類加。例如:類a a的對象的對象a1a1、a2a2、a3a3,希,希望:望: a3 = a1 + a2a3 = a1 + a2; 即:分別把對象即
2、:分別把對象a1a1和和a2a2的各個數(shù)據(jù)成員的各個數(shù)據(jù)成員值對應(yīng)相加,然后賦給對象值對應(yīng)相加,然后賦給對象a3a3。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 3v把某些事交給系統(tǒng)去做,用戶只要知道把某些事交給系統(tǒng)去做,用戶只要知道相加就可相加就可v擴(kuò)充運(yùn)算符的功能擴(kuò)充運(yùn)算符的功能v增強(qiáng)了增強(qiáng)了c+ c+ 語言的可擴(kuò)充性語言的可擴(kuò)充性v使用戶定義的類更像系統(tǒng)的內(nèi)置類型使用戶定義的類更像系統(tǒng)的內(nèi)置類型程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 4v不是所有的運(yùn)算符都能重載不是所有的運(yùn)算符都能重載v重載不能改變運(yùn)算符的優(yōu)先級和結(jié)合性重載不能改變運(yùn)算符的優(yōu)先級和結(jié)合性v重載不能改變
3、運(yùn)算符的操作數(shù)個數(shù)重載不能改變運(yùn)算符的操作數(shù)個數(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幾個特殊的運(yùn)算符的重載幾個特殊的運(yùn)
4、算符的重載 v自定義類型轉(zhuǎn)換運(yùn)算符自定義類型轉(zhuǎn)換運(yùn)算符v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 8v運(yùn)算符重載就是寫一個函數(shù)解釋某個運(yùn)算符運(yùn)算符重載就是寫一個函數(shù)解釋某個運(yùn)算符在某個類中的含義在某個類中的含義v要使得系統(tǒng)能自動找到重載的這個函數(shù),函要使得系統(tǒng)能自動找到重載的這個函數(shù),函數(shù)名必須要體現(xiàn)出和某個被重載的運(yùn)算符的數(shù)名必須要體現(xiàn)出和某個被重載的運(yùn)算符的聯(lián)系。聯(lián)系。vc+中規(guī)定,重載函數(shù)名為中規(guī)定,重載函數(shù)名為 operator 其中,其中,為要重載的運(yùn)算符。如要重載為要重載的運(yùn)算符。如要重載“+”運(yùn)算符,該重載函數(shù)名為運(yùn)算符,該重載函數(shù)名為op
5、erator+。要重載。要重載賦值運(yùn)算符,函數(shù)名為賦值運(yùn)算符,函數(shù)名為operator=。 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 9v運(yùn)算符的重載不能改變運(yùn)算符的運(yùn)算對象數(shù)。因此,重載運(yùn)算符的重載不能改變運(yùn)算符的運(yùn)算對象數(shù)。因此,重載函數(shù)的形式參數(shù)個數(shù)(包括成員函數(shù)的隱式指針函數(shù)的形式參數(shù)個數(shù)(包括成員函數(shù)的隱式指針this)與運(yùn))與運(yùn)算符的運(yùn)算對象數(shù)相同算符的運(yùn)算對象數(shù)相同 v運(yùn)算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實(shí)運(yùn)算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實(shí)現(xiàn)。重載成全局函數(shù)時,最好把此函數(shù)設(shè)為友員函數(shù)現(xiàn)。重載成全局函數(shù)時,最好把此函數(shù)設(shè)為友員函數(shù)v如果作為類
6、的成員函數(shù),它的形式參數(shù)個數(shù)比運(yùn)算符的運(yùn)如果作為類的成員函數(shù),它的形式參數(shù)個數(shù)比運(yùn)算符的運(yùn)算對象數(shù)少算對象數(shù)少1。這是因?yàn)槌蓡T函數(shù)有一個隱含的參數(shù)。這是因?yàn)槌蓡T函數(shù)有一個隱含的參數(shù)this。在在c+中,把隱含參數(shù)中,把隱含參數(shù)this作為運(yùn)算符的第一個參數(shù)。作為運(yùn)算符的第一個參數(shù)。v當(dāng)把一個一元運(yùn)算符重載成成員函數(shù)時,該函數(shù)沒有形式當(dāng)把一個一元運(yùn)算符重載成成員函數(shù)時,該函數(shù)沒有形式參數(shù)。參數(shù)。v把一個二元運(yùn)算符重載成成員函數(shù)時,該函數(shù)只有一個形把一個二元運(yùn)算符重載成成員函數(shù)時,該函數(shù)只有一個形式參數(shù),就是右操作數(shù),當(dāng)前對象是左操作數(shù)。式參數(shù),就是右操作數(shù),當(dāng)前對象是左操作數(shù)。程序設(shè)計(jì) cs.s
7、jtu 2011.9程序設(shè)計(jì) - 10v為為rational類增加類增加“+”和和“*”以及比較以及比較的重載函數(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 ope
8、rator*(const rational &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 rationa
9、l tmp; tmp.num = num * r1.den + r1.num * 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:o
10、perator(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 num * r1.den =(const rational &r1) const return num * r1.den = den * r1.num; bool rational:operator!=(const rati
11、onal &r1) const return !(*this = r1);程序設(shè)計(jì) cs.sjtu 2011.9程序設(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 &
12、;r2) ; friend bool operator=(const rational &r1 , const rational &r2); friend bool operator!=(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 20
13、11.9程序設(shè)計(jì) - 15rational operator+(const rational &r1, const rational &r2) rational tmp; tmp.num = r1.num * 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 * r
14、2.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 main() 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.
15、display(); cout )必須重載成成員函數(shù)。)必須重載成成員函數(shù)。v具有賦值意義的運(yùn)算符,如復(fù)合的賦值運(yùn)算符以及具有賦值意義的運(yùn)算符,如復(fù)合的賦值運(yùn)算符以及+和和-,不一定非要定義為成員函數(shù),但最好定義為成員函數(shù),不一定非要定義為成員函數(shù),但最好定義為成員函數(shù)。v具有兩個運(yùn)算對象的運(yùn)算符最好重載為全局函數(shù),這樣具有兩個運(yùn)算對象的運(yùn)算符最好重載為全局函數(shù),這樣可以使得應(yīng)用更加靈活。如果把加運(yùn)算定義成全局函數(shù)可以使得應(yīng)用更加靈活。如果把加運(yùn)算定義成全局函數(shù),r是有理數(shù)類的對象,則是有理數(shù)類的對象,則2+r是一個合法的表達(dá)式。是一個合法的表達(dá)式。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)
16、計(jì) - 18v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的方法 v幾個特殊的運(yùn)算符的重載幾個特殊的運(yùn)算符的重載 v自定義類型轉(zhuǎn)換運(yùn)算符自定義類型轉(zhuǎn)換運(yùn)算符v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例 程序設(shè)計(jì) cs.sjtu 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對任一類,如果用戶沒有自定義賦值運(yùn)算對任一類,如果用戶沒有自定義賦值運(yùn)算符函數(shù),那
17、么系統(tǒng)為其生成一個缺省的賦符函數(shù),那么系統(tǒng)為其生成一個缺省的賦值運(yùn)算符函數(shù),在對應(yīng)的數(shù)據(jù)成員間賦值值運(yùn)算符函數(shù),在對應(yīng)的數(shù)據(jù)成員間賦值。v一般情況下,這個缺省的賦值運(yùn)算符重載一般情況下,這個缺省的賦值運(yùn)算符重載函數(shù)能滿足用戶的需求。但是,當(dāng)類含有函數(shù)能滿足用戶的需求。但是,當(dāng)類含有類型為指針的數(shù)據(jù)成員時,可能會帶來一類型為指針的數(shù)據(jù)成員時,可能會帶來一些麻煩。些麻煩。 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 21v會引起內(nèi)存泄漏會引起內(nèi)存泄漏v使這兩個數(shù)組的元素存放于同一塊空間中使這兩個數(shù)組的元素存放于同一塊空間中v當(dāng)這兩個對象析構(gòu)時,先析構(gòu)的對象會釋當(dāng)這兩個對象析構(gòu)時,先析構(gòu)的對
18、象會釋放存儲數(shù)組元素的空間。而當(dāng)后一個對象放存儲數(shù)組元素的空間。而當(dāng)后一個對象析構(gòu)時,無法釋放存放數(shù)組元素的空間析構(gòu)時,無法釋放存放數(shù)組元素的空間程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 22v賦值運(yùn)算符只能重載成成員函數(shù)賦值運(yùn)算符只能重載成成員函數(shù)v函數(shù)原型:函數(shù)原型: x &x:operator=(const x &source) / 賦值過程賦值過程 一旦創(chuàng)建了對象一旦創(chuàng)建了對象x1, x2, 可以用可以用 x1 = x2賦值。賦值。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 23doublearray &doublearray:operator
19、= (const doublearray &right) if (this = &right) return *this; delete storage; low = right.low; high = right.high; storage = new 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一般來講,需要自定義拷貝構(gòu)造函數(shù)的類也需要一般來
20、講,需要自定義拷貝構(gòu)造函數(shù)的類也需要自定義賦值運(yùn)算符重載函數(shù)。自定義賦值運(yùn)算符重載函數(shù)。v在賦值運(yùn)算符重載函數(shù)中,已經(jīng)將參數(shù)的值賦值在賦值運(yùn)算符重載函數(shù)中,已經(jīng)將參數(shù)的值賦值給了當(dāng)前對象,那為什么還需要返回值呢?記住給了當(dāng)前對象,那為什么還需要返回值呢?記住,在,在c+中,賦值是一個運(yùn)算,它可以形成一個中,賦值是一個運(yùn)算,它可以形成一個表達(dá)式,而該表達(dá)式的結(jié)果值就是賦給左邊的對表達(dá)式,而該表達(dá)式的結(jié)果值就是賦給左邊的對象的值。因此,賦值運(yùn)算符重載函數(shù)必須返回賦象的值。因此,賦值運(yùn)算符重載函數(shù)必須返回賦給左邊的對象值。給左邊的對象值。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 25v一般
21、來講,需要拷貝構(gòu)造函數(shù)的類也需一般來講,需要拷貝構(gòu)造函數(shù)的類也需要重載賦值運(yùn)算符要重載賦值運(yùn)算符v定義對象時給對象賦初值調(diào)用的是拷貝定義對象時給對象賦初值調(diào)用的是拷貝構(gòu)造函數(shù)構(gòu)造函數(shù)v程序的語句部分中的賦值語句調(diào)用的是程序的語句部分中的賦值語句調(diào)用的是賦值運(yùn)算符重載函數(shù)賦值運(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
22、能否象普通的數(shù)組那樣通過下標(biāo)運(yùn)算操作能否象普通的數(shù)組那樣通過下標(biāo)運(yùn)算操作doublearray類的對象,這樣可以使類的對象,這樣可以使doublearray類更像一個功能內(nèi)置的數(shù)組。類更像一個功能內(nèi)置的數(shù)組。v可以通過重載下標(biāo)運(yùn)算符(可以通過重載下標(biāo)運(yùn)算符()來實(shí)現(xiàn))來實(shí)現(xiàn) v下標(biāo)運(yùn)算符是二元運(yùn)算符,第一個運(yùn)算數(shù)是下標(biāo)運(yùn)算符是二元運(yùn)算符,第一個運(yùn)算數(shù)是數(shù)組名,第二個運(yùn)算數(shù)是下標(biāo)值數(shù)組名,第二個運(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
23、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ù)組輸入:數(shù)組輸入: for (i=20; i=30; +i) cout 請輸入第請輸入第 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
24、, 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賦值運(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這兩個操作符可以是前綴,也
25、可以是后這兩個操作符可以是前綴,也可以是后綴。而且前綴和后綴的含義是有區(qū)別的綴。而且前綴和后綴的含義是有區(qū)別的。所以,必須有兩個重載函數(shù)。所以,必須有兩個重載函數(shù)。 v問題:兩個重載函數(shù)有相同的原型問題:兩個重載函數(shù)有相同的原型v區(qū)分方法:區(qū)分方法: 前綴:一元操作符。前綴:一元操作符。 后綴:二元操作符。后綴:二元操作符。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 37v成員函數(shù)重載成員函數(shù)重載 +ob重載為:重載為:ob.operator+() ob- 重載為:重載為:ob.operator-(int)v友元函數(shù)重載友元函數(shù)重載 +ob重載為:重載為:operator+(x &am
26、p;ob) ob-重載為:重載為:operator-(x &ob, int)v調(diào)用時,參數(shù)調(diào)用時,參數(shù)int一般傳遞給值一般傳遞給值0。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 38v設(shè)計(jì)一個會報(bào)警的計(jì)數(shù)器類。該計(jì)數(shù)器設(shè)計(jì)一個會報(bào)警的計(jì)數(shù)器類。該計(jì)數(shù)器從從0開始計(jì)數(shù),當(dāng)?shù)竭_(dá)預(yù)先設(shè)定好的報(bào)開始計(jì)數(shù),當(dāng)?shù)竭_(dá)預(yù)先設(shè)定好的報(bào)警值時,計(jì)數(shù)器會發(fā)出報(bào)警消息,計(jì)數(shù)警值時,計(jì)數(shù)器會發(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)警
27、值public:counter(int a) value = 0; alarm = a;counter & operator+(); /前綴的前綴的+重載重載counter operator+(int); /后綴的后綴的+重載重載void print() cout value endl; ; 程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 40counter & counter:operator+() if (value = alarm) cout 已超過報(bào)警值已超過報(bào)警值n; else +value; if (value = alarm) cout 已到達(dá)報(bào)警值已到達(dá)報(bào)警
28、值n; return *this;counter counter:operator+(int x) counter tmp = *this; /保存對象修改前的狀態(tài)保存對象修改前的狀態(tài) if (value = alarm) cout 已超過報(bào)警值已超過報(bào)警值n; else +value; if (value = alarm) cout )()和流提取運(yùn)算符和流提取運(yùn)算符()()輸入和輸出用戶自定輸入和輸出用戶自定義類的對象義類的對象程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 48ostream & operator(ostream & os, const classty
29、pe &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;如定義:如定義:rational r(2,6);執(zhí)行執(zhí)行cout )()和流提取運(yùn)算符和流提取運(yùn)算符()(istream & is, classtype &obj) is 要輸入的內(nèi)容;要輸入的內(nèi)容; return is;
30、 程序設(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 從鍵盤輸入從鍵盤輸入r的數(shù)據(jù)。如輸入為:的數(shù)據(jù)。如輸入為:1 3執(zhí)行執(zhí)行cout (istream &in, rational& obj); friend ostream& operator(ostream
31、 &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();public:rational(int n = 0, int d = 1) num = n; den = d;operator dou
32、ble () 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; r4 = (r1 + r2) * r3; cout (r1 + r2) * r3的值為:的值為: r4 endl; x = 5.5
33、 - 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)算符重載的方法 v幾個特殊的運(yùn)算符的重載幾個特殊的運(yùn)算符的重載 v自定義類型轉(zhuǎn)換運(yùn)算符自定義類型轉(zhuǎn)換運(yùn)算符 v運(yùn)算符重載實(shí)例運(yùn)算符重載實(shí)例
34、程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 65v完善完善doublearray類類程序設(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, const doublearray &obj2);private: int low; in
35、t 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(int index); const double &am
36、p; 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類的實(shí)現(xiàn)類的實(shí)現(xiàn)#include #include doublearray.h“doublearray:doublearray(const doublearray &arr) low = arr.low; high = arr
37、.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 doublehig
38、h - 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 請輸入數(shù)組元素請輸入數(shù)組元素 obj.low , obj.high :n; for (int i=obj.low; i obji ; return is
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 夜宵店合同范本模板
- 農(nóng)民果苗批發(fā)銷售合同范本
- 大額結(jié)款合同范例
- 內(nèi)勤人員合同范本
- 產(chǎn)品研發(fā)定制合同范例
- 人工路面合同范例
- 勞務(wù)訂金合同范例
- 土地用途變更合同范例
- 勞務(wù)與工人合同范本
- 農(nóng)場品代理合同范例
- 2025年廣東省春季高考英語情景交際題專項(xiàng)練習(xí)(含答案)
- (二模)遵義市2025屆高三年級第二次適應(yīng)性考試試卷 地理試卷(含答案)
- 二零二五隱名股東合作協(xié)議書及公司股權(quán)代持及回購協(xié)議
- 浙江省湖州是吳興區(qū)2024年中考語文二模試卷附參考答案
- 風(fēng)電設(shè)備安裝施工專項(xiàng)安全措施
- IQC培訓(xùn)課件教學(xué)課件
- 2025年計(jì)算機(jī)二級WPS考試題目
- 高管績效考核全案
- 2024年上海市中考英語試題和答案
- 教育部《中小學(xué)校園食品安全和膳食經(jīng)費(fèi)管理工作指引》知識培訓(xùn)
- 長沙醫(yī)學(xué)院《無機(jī)化學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
評論
0/150
提交評論