日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C++類的構(gòu)建--complex(復數(shù))類的設計過程與思考總結(jié)

 路人甲Java 2021-06-20

項目

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ù)的相加

設計完成后的代碼

#ifndef __MYCOMPLEX__
#define __MYCOMPLEX__

class complex;
complex&
__doapl(complex* ths, const complex& r);
complex&

__doami(complex* ths, const complex& r);
complex&
__doaml(complex* ths, const complex& r);


class complex
{
public:
complex(double r = 0, double i = 0) : re(r), im(i) { }
complex& operator += (const complex&);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;

friend complex& __doapl(complex*, const complex&);

};


inline complex&
__doapl(complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}

inline complex&
complex::operator += (const complex& r)
{
return __doapl(this, r);
}


inline double
imag(const complex& x)
{
return x.imag();
}

inline double
real(const complex& x)
{
return x.real();
}

inline complex
operator + (const complex& x, const complex& y)
{
return complex(real(x) + real(y), imag(x) + imag(y));
}

inline complex
operator + (const complex& x, double y)
{
return complex(real(x) + y, imag(x));
}

inline complex
operator + (double x, const complex& y)
{
return complex(x + real(y), imag(y));
}

endif //MYCOMPLEX

設計:

1)確定成員變量以及get方法 思考函數(shù)const,real()和img需要加,因為不需要修改值。

2)確定重載符號operator +=方法。

complex& operator +=(const complex&);

?思考返回值是什么類型。我們在復數(shù)類計算時,經(jīng)常 x+=y,等價于x = x+y. 因此,確定返回的是原來的x的值,也就是this。我們可以得出,直接傳回引用,因為我們傳回去得并不是local variable。但為什么我們不設計是void類型呢?因為當我們計算x+=y的時候,我們可以直接通過引用改變x的值呀?

就比如:

complex& operator +=(const complex& c){
this.re = this.re+c.real();
}

原因就在于,在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ù)的重載:

/**
有三種情況
1.復數(shù)加復數(shù)
2.復數(shù)+double
3.double+復數(shù)
**/
inline complex
operator + (const complex& x, const complex& y)
{
  return complex (real (x) + real (y), imag (x) + imag (y));
}

inline complex
operator + (const complex& x, double y)
{
  return complex (real (x) + y, imag (x));
}

inline complex
operator + (double x, const complex& y)
{
  return complex (x + real (y), imag (y));
}
從complex得到的經(jīng)驗

1)若方法不需要修改數(shù)據(jù),一定加上const,因為const對象只能調(diào)用const方法。若方法不加const,const對象功能不全。

  1. 形式參數(shù)都應該傳遞引用,如果不需要修改,則一定加上const,否則原值可能被修改。若直接傳遞了值,則發(fā)生復制,會很慢。當然,char這種一個字節(jié)的參數(shù)可以傳值。

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ù)體的編寫。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多