項目1.設計complex(復數(shù)類)?需求:1)實部,虛部re,im ? 2)重寫+=符號,調(diào)用friend_doapl函數(shù),對兩個復數(shù)進行相加 其中+=函數(shù)調(diào)用一個全局函數(shù)_doapl(complex*,complext&)進行處理。這里只用完成兩個復數(shù)的相加 ?3)重寫+符號,這里只用完成兩個復數(shù),復數(shù)和實數(shù)的相加 設計完成后的代碼
endif //MYCOMPLEX設計:1)確定成員變量以及get方法 思考函數(shù)const,real()和img需要加,因為不需要修改值。 2)確定重載符號operator +=方法。
?思考返回值是什么類型。我們在復數(shù)類計算時,經(jīng)常 x+=y,等價于x = x+y. 因此,確定返回的是原來的x的值,也就是this。我們可以得出,直接傳回引用,因為我們傳回去得并不是local variable。但為什么我們不設計是void類型呢?因為當我們計算x+=y的時候,我們可以直接通過引用改變x的值呀? 就比如:
原因就在于,在c++中可以連續(xù)復制,如 x1+=x2+=x3; 當發(fā)生這種情況的時候,引用必須返回以供作為右值以供下一次的運算。 思考形式參數(shù)。能用引用得就用引用。且原值能不能修改呢? x = x+y this指的是x的數(shù)據(jù),形式參數(shù)指的是y的數(shù)據(jù)。x的數(shù)據(jù)發(fā)生了改變,但是y的沒有。所以我們得出,形式參數(shù)要加上const。 3)全局函數(shù)_doapl(complex&,complext&) ?可能是因為其他地方也要用到,所以就把它寫成了全局函數(shù)而不是成員函數(shù)。為了實現(xiàn) operator+=調(diào)用它,我們得將它聲明為一個友元。 ?其成員變量兩個一個是complex*而非complex&的原因是,要傳入this,與operator+=發(fā)生聯(lián)動。 4)設計 operator+重載 ?思考返回值類型,假設有 x3 = x1+x2。x3必然是在函數(shù)內(nèi)新建一個變量并返回,所以不能返回一個局部變量的引用。只能使用值傳遞。 ?此外,我們可以注意到,operator+定義在了類外,因為它不需要this這個變量,且operator+二目運算符只允許有兩個參數(shù),要想不加入this(類內(nèi)函數(shù)默認添加this形式參數(shù)),只能寫在類外作為成員函數(shù)。 ?那還有幾個問題,復數(shù)相加有很多種可能,以下是應該考慮的可能性,我們必須根據(jù)這些可能性設計函數(shù)的重載:
從complex得到的經(jīng)驗1)若方法不需要修改數(shù)據(jù),一定加上const,因為const對象只能調(diào)用const方法。若方法不加const,const對象功能不全。
3)返回值也盡量用引用傳遞,快。但是一定不能返回局部變量的引用,因為局部變量存在棧中,方法執(zhí)行完之后內(nèi)存就被回收了。 4)簡單的函數(shù)要加inline即使編譯器會自動選擇。 5).h文件的劃分 其中,類聲明里的函數(shù)不用寫具體的形式參數(shù),只用寫形式參數(shù)的類型即可。簡單的函數(shù)可以在類聲明部分就定義如 real()和Img()。復雜的應該在函數(shù)體外進行定義。最后,類內(nèi)的函數(shù)均會自動加上inline,在類外定義的函數(shù)若比較簡單,應該手動建議編譯器使用inlien. 6)操作符重載時,若是雙目運算符 如 + 則應該定義為全局函數(shù)。 如z = x+y。使用+號時,不需要this的值。 與之相對的是單目運算符,如==或+= 如判斷 z==y 的時候,我們需要用到z的值,所以必須定義在類內(nèi),所以就沒有意義了 但簡單的如real()可以寫完函數(shù)體。復雜的函數(shù)應該在類定義區(qū)域完成函數(shù)體的編寫。 |
|