



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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自定義類型轉(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個(gè)對(duì)象間的個(gè)對(duì)象間的加。例如:類加。例如:類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)去做,用戶只要知道把某些事交給系統(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)先級(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)
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)算符重載就是寫一個(gè)函數(shù)解釋某個(gè)運(yùn)算符運(yùn)算符重載就是寫一個(gè)函數(shù)解釋某個(gè)運(yùn)算符在某個(gè)類中的含義在某個(gè)類中的含義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ù)名為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)算對(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如果作為類
6、的成員函數(shù),它的形式參數(shù)個(gè)數(shù)比運(yùn)算符的運(yùn)如果作為類的成員函數(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ù)沒有形式當(dāng)把一個(gè)一元運(yùn)算符重載成成員函數(shù)時(shí),該函數(shù)沒有形式參數(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.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具有兩個(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ù)類的對(duì)象,則是有理數(shù)類的對(duì)象,則2+r是一個(gè)合法的表達(dá)式。是一個(gè)合法的表達(dá)式。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)
16、計(jì) - 18v什么是運(yùn)算符重載什么是運(yùn)算符重載 v運(yùn)算符重載的方法運(yùn)算符重載的方法 v幾個(gè)特殊的運(yùn)算符的重載幾個(gè)特殊的運(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對(duì)任一類,如果用戶沒有自定義賦值運(yùn)算對(duì)任一類,如果用戶沒有自定義賦值運(yùn)算符函數(shù),那
17、么系統(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ù)能滿足用戶的需求。但是,當(dāng)類含有函數(shù)能滿足用戶的需求。但是,當(dāng)類含有類型為指針的數(shù)據(jù)成員時(shí),可能會(huì)帶來一類型為指針的數(shù)據(jù)成員時(shí),可能會(huì)帶來一些麻煩。些麻煩。 程序設(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ì)
18、象會(huì)釋放存儲(chǔ)數(shù)組元素的空間。而當(dāng)后一個(gè)對(duì)象放存儲(chǔ)數(shù)組元素的空間。而當(dāng)后一個(gè)對(duì)象析構(gòu)時(shí),無法釋放存放數(shù)組元素的空間析構(gòu)時(shí),無法釋放存放數(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)建了對(duì)象一旦創(chuàng)建了對(duì)象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)前對(duì)象,那為什么還需要返回值呢?記住給了當(dāng)前對(duì)象,那為什么還需要返回值呢?記住,在,在C+中,賦值是一個(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一般
21、來講,需要拷貝構(gòu)造函數(shù)的類也需一般來講,需要拷貝構(gòu)造函數(shù)的類也需要重載賦值運(yùn)算符要重載賦值運(yùn)算符v定義對(duì)象時(shí)給對(duì)象賦初值調(diào)用的是拷貝定義對(duì)象時(shí)給對(duì)象賦初值調(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類的對(duì)象,這樣可以使類的對(duì)象,這樣可以使DoubleArray類更像一個(gè)功能內(nèi)置的數(shù)組。類更像一個(gè)功能內(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)算符,第一個(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
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 請(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
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這兩個(gè)操作符可以是前綴,也
25、可以是后這兩個(gè)操作符可以是前綴,也可以是后綴。而且前綴和后綴的含義是有區(qū)別的綴。而且前綴和后綴的含義是有區(qū)別的。所以,必須有兩個(gè)重載函數(shù)。所以,必須有兩個(gè)重載函數(shù)。 v問題:兩個(gè)重載函數(shù)有相同的原型問題:兩個(gè)重載函數(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í),參數(shù)調(diào)用時(shí),參數(shù)int一般傳遞給值一般傳遞給值0。程序設(shè)計(jì) cs.sjtu 2011.9程序設(shè)計(jì) - 38v設(shè)計(jì)一個(gè)會(huì)報(bào)警的計(jì)數(shù)器類。該計(jì)數(shù)器設(shè)計(jì)一個(gè)會(huì)報(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)警值時(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)警
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; /保存對(duì)象修改前的狀態(tài)保存對(duì)象修改前的狀態(tài) if (value = alarm) cout 已超過報(bào)警值已超過報(bào)警值n; else +value; if (value = alarm) cout )()和流提取運(yùn)算符和流提取運(yùn)算符()()輸入和輸出用戶自定輸入和輸出用戶自定義類的對(duì)象義類的對(duì)象程序設(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幾個(gè)特殊的運(yùn)算符的重載幾個(gè)特殊的運(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 doublehigh
38、 - 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 ; return i
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c2混凝土配合比設(shè)計(jì)報(bào)告
- 中國(guó)移動(dòng)照明車行業(yè)市場(chǎng)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 2025屆內(nèi)蒙古北方重工第三中學(xué)高二化學(xué)第二學(xué)期期末教學(xué)質(zhì)量檢測(cè)模擬試題含解析
- 植絨布蝴蝶結(jié)行業(yè)深度研究分析報(bào)告(2024-2030版)
- 2025年中國(guó)小型柴油機(jī)(非道路)行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略研究報(bào)告
- 中國(guó)節(jié)育環(huán)取放器行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告(2024-2030)
- 山西省長(zhǎng)治市屯留縣第一中學(xué)校2025屆高一化學(xué)第二學(xué)期期末綜合測(cè)試模擬試題含解析
- 中國(guó)橡膠襯里行業(yè)調(diào)查研究報(bào)告
- 數(shù)據(jù)報(bào)表分析財(cái)務(wù)報(bào)告
- 交通事故未成年人賠償
- 2025年吉林省中考物理試卷真題及答案詳解(精校打印版)
- 江蘇省南京市六校聯(lián)合體2024-2025學(xué)年高一下學(xué)期期末調(diào)研測(cè)試歷史試題(含答案)
- 標(biāo)準(zhǔn)的編寫講課件
- 學(xué)堂在線 護(hù)理研究方法 期末考試答案
- 2025年湖南省中考英語試卷真題(含答案解析)
- 2025年法律職業(yè)資格考試民法專項(xiàng)練習(xí)卷:合同法真題解析及試題
- 2025年天津市中考英語真題試卷及答案
- 玻尿酸介紹課件
- 2025至2030年中國(guó)電子束曝光系統(tǒng)行業(yè)市場(chǎng)研究分析及發(fā)展前景研判報(bào)告
- 2025中國(guó)心肌病綜合管理指南要點(diǎn)解讀課件
- 2025屆重慶市梁平區(qū)英語七年級(jí)第二學(xué)期期末調(diào)研模擬試題含答案
評(píng)論
0/150
提交評(píng)論