小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 路人甲Java 2021-06-20

項目

1.設(shè)計complex(復(fù)數(shù)類)

?需求:1)實部,虛部re,im

? 2)重寫+=符號,調(diào)用friend_doapl函數(shù),對兩個復(fù)數(shù)進行相加 其中+=函數(shù)調(diào)用一個全局函數(shù)_doapl(complex*,complext&)進行處理。這里只用完成兩個復(fù)數(shù)的相加

?3)重寫+符號,這里只用完成兩個復(fù)數(shù),復(fù)數(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

設(shè)計:

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

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

complex& operator +=(const complex&);

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

就比如:

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

原因就在于,在c++中可以連續(xù)復(fù)制,如 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)設(shè)計 operator+重載

?思考返回值類型,假設(shè)有 x3 = x1+x2。x3必然是在函數(shù)內(nèi)新建一個變量并返回,所以不能返回一個局部變量的引用。只能使用值傳遞。

?此外,我們可以注意到,operator+定義在了類外,因為它不需要this這個變量,且operator+二目運算符只允許有兩個參數(shù),要想不加入this(類內(nèi)函數(shù)默認添加this形式參數(shù)),只能寫在類外作為成員函數(shù)。

?那還有幾個問題,復(fù)數(shù)相加有很多種可能,以下是應(yīng)該考慮的可能性,我們必須根據(jù)這些可能性設(shè)計函數(shù)的重載:

/**
有三種情況
1.復(fù)數(shù)加復(fù)數(shù)
2.復(fù)數(shù)+double
3.double+復(fù)數(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ù)都應(yīng)該傳遞引用,如果不需要修改,則一定加上const,否則原值可能被修改。若直接傳遞了值,則發(fā)生復(fù)制,會很慢。當然,char這種一個字節(jié)的參數(shù)可以傳值。

3)返回值也盡量用引用傳遞,快。但是一定不能返回局部變量的引用,因為局部變量存在棧中,方法執(zhí)行完之后內(nèi)存就被回收了。

4)簡單的函數(shù)要加inline即使編譯器會自動選擇。

5).h文件的劃分

其中,類聲明里的函數(shù)不用寫具體的形式參數(shù),只用寫形式參數(shù)的類型即可。簡單的函數(shù)可以在類聲明部分就定義如 real()和Img()。復(fù)雜的應(yīng)該在函數(shù)體外進行定義。最后,類內(nèi)的函數(shù)均會自動加上inline,在類外定義的函數(shù)若比較簡單,應(yīng)該手動建議編譯器使用inlien.

6)操作符重載時,若是雙目運算符 如 + 則應(yīng)該定義為全局函數(shù)。

如z = x+y。使用+號時,不需要this的值。

與之相對的是單目運算符,如==或+=

如判斷 z==y 的時候,我們需要用到z的值,所以必須定義在類內(nèi),所以就沒有意義了

但簡單的如real()可以寫完函數(shù)體。復(fù)雜的函數(shù)應(yīng)該在類定義區(qū)域完成函數(shù)體的編寫。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多