類在編寫過程中的一些注意事項,編寫過程注意事項

來源:互聯網
上載者:User

類在編寫過程中的一些注意事項,編寫過程注意事項

在編寫類的時候我們要很好的把握細節問題,不僅僅要去避免一些明顯的錯誤,更多的是如何形成良好的編程風格。下面我們將從下面的一個例子分析類的編寫技巧:

class Complex

{

public:

   Complex(double real,double imaginary = 0):_real(real),_imaginary(imaginary){ }

   void operator+(Complex other)

   {

      _real =_real +other._real;

      _imaginary = _imaginary + other._imaginary;

   }

   void operator<<(ostream os)

   {

      os << "(" << _real << "," << _imaginary << ")";

   }

   Complex operator++()

   {

      ++_real;

      return *this;

   }

   Complex operator++(int)

   {
      Complex temp = *this;

      ++_real;

      return temp;

   }

private:

   double _real,_imaginary;

}

1、我們要當心在隱式類型轉換中產生的隱含臨時對象。避免這個問題的一個好方法就是,儘可能的在建構函式中進行顯示的類型轉換,並要避免編寫類型轉換運算子。

由於上述類中的建構函式的第二個參數有預設值,因此這個函數也可當成是單參數的建構函式來使用,這也意味著可以進行從double類型到Complex類型的隱式轉換。要注意這種類型轉換可能並不總是我們所希望的。

2、在傳遞參數對象時,我們應該優先選擇const&的方式,而不是傳值方式。例如:

void operator+(Complex other)在傳遞參數時將會有臨時對象的產生,執行效率會降低

3、我們應該優先選擇“a op=b”這種寫法,而不是“a = a op b”(這裡的op表示的是某個運算子)。這種寫法更為清晰,而且效率也更高。

為什麼operator+=的效率會更高?原因就在於這個運算子是直接對其左邊的對象進行運算,並且返回的是一個引用而不是臨時對象。而operator+則必須返回一個臨時對象。例如:

T& T::operator+=(const T& other)

{

   //...

   return *this;

}

const T operator+(const T& a,const T& b)

{

   T temp(a);

   temp+=b;

   return temp;

}

我們要注意的是運算子+和+=之間的關係。前者是通過後者來實現的,這不僅是為了實現代碼的簡潔性,也是為了保證代碼的一致性。注意,為了防止程式員編寫出像“a+b = c”這樣的運算式,所返回的臨時對象的類型應該是“const Complex”(而不是Complex),這就是為什麼上面的operator+中返回的是const T的原因。

4、在C++標準中規定:必須將運算子=、( )、[ ]和->定義為成員函數,而在類中定義的new、new[]、delete和delete[]等運算子函數必須是靜態成員函數。對於其他的運算子函數:如果運算子函數時用於對流進行I/O的operator>>或者operator<<;或者如果需要對其左參數進行類型轉換;或者如果可以通過類的公有介面來實現,那麼將這個函數定義為非成員函數(在前兩種情況中,如果需要的話也可以被定義為友元函數)。如果運算子函數需要實現虛函數的行為,那麼請增加一個虛成員函數來提供虛函數的行為,那麼請增加一個虛成員函數來提供虛函數的行為,並用這個虛成員函數來實現運算子函數。否則將運算子函數定義為成員函數。

5、operator<< 不應該被定義為成員函數。並且,非成員函數operator<<應該使用成員函數(通常是虛函數)來實現,並且這個成員函數的功能就是進行流輸出。更進一步,operator<<應該返回一個“ostream&”類型的應用,並且所應用的就是這個流對象,這是為了實現鏈式操作。

6、前置遞增運算子應該返回一個非常量的引用,這不僅使客戶代碼能夠以更直觀的方式來編寫,而且還避免了不必要的低效率。在後置遞增運算子函數中應該返回一個常量值。這種做法可以防止對返回的對象進行修改,從而避免了想“a++++”這樣的問題代碼。並且為了保持代碼的一致性,我們應該使用前置遞增來實現後置遞增。

7、要避免使用保留名字。在C++標準庫的實現中保留了一些帶有前置底線的標識符,這些保留的標識符是很難記住的,因此,最好是根本不要使用前置底線。

經過以上的分析,我們修改後的類為:

class Complex

{

public:

   explicit Complex(double real,double imaginary = 0):_real(real),_imaginary(imaginary){ }

   Complex& operator+=(const Complex& other)

   {

      _real += other._real;

      _imaginary += other._imaginary;

      return *this;

   }

   Complex& operator++()

   {

      ++_real;

      return *this;

   }

   const Complex operator++(int)

   {
      Complex temp (*this);

      ++_real;

      return temp;

   }

   ostream& Print(ostream& os) const

   {

      return os << "(" << real_ <<","<< imaginary_ << ")";

   }

private:

   double real_,imaginary_;

}

const Complex operator+(const Complex& lhs,const Complex& rhs)

{

   Complex ret(lhs);

   ret+=rhs;

   return ret;

}

ostream& operator<<(ostream& os,const Complex& c)

{

   return c.Print(os);

}


在學習編程的過程中,應該注意什

在當你學會了一門語言的時候(也就是說,你記住了該語言的文法,詞法,還有一些常用的函數),就意味著你已經掌握了編寫程式的基本工具。無論你用的是啥語言,都差不多。只是工具之間有長有短。比如說,Delphi,VB之類做Windows環境的應用程式很方便;用Java開發基於網路的程式很輕鬆;C,C++適合開發系統級軟體。假如我們用C(C++)寫一個記事本,估計要寫數百行代碼,而且不能保證沒有大錯誤,而用delphi,,或VC來做,就只要滑鼠點點控制項,幾下就完成了,可謂方便。這就是說工具各有特點,各個方面都有各個方面的最適合的工具。不過工具只是工具,光靠工具是寫不出好的程式的。就好比我要寫一篇文章出來,首先確定用啥語言來寫(漢,英,俄還是其他?很顯然,如果我是寫給中國人看,自然用中文,寫給美國人看,當然用英文。)好,確定了語言之後呢?我就能寫文章了嗎?文章結構如何設計?寫文章的方法技巧和注意事項是什嗎?這些我都不知道,自然寫不出好文章。可見,要寫一篇好文章,會語言是遠遠不夠的。同樣,要寫出好的程式(程式運行結果正確,時間,空間效率高,健壯性好,可讀性強等等),光會一門語言也是遠遠不夠的。學習編程方法才是我們應該做的。大學電腦教育也是先從教授一門語言開始(一般是C語言),然後,緊接著就開始資料結構和演算法的學習。資料結構和演算法設計分析是整個編程方法的基礎,重中之重,也是考研專業課必考科目。以前流行過一句話:資料結構+演算法=程式。這是不無道理的。資料在電腦中的表示和儲存不是無組織的,是有規律,有結構的。因此,當我們對這些資料操作的時候,理論上存在一種與某結構相比配的最優(或近式最優)演算法,以次來確保操作資料的時空效率。打個比方,現有一排資料:a,b,c,d,e,如果經常要對其進行尋找操作,順序排列儲存該數列能降低操作的時間。同樣如果經常要對其進行插入或刪除操作,採用連結儲存則能降低該操作的時間複雜度。由此可見,合理的資料結構,高效的演算法對程式品質有著多麼重要的影響!又比如,我們要編寫程式能對中國所有公民的社會安全號碼進行排序。這是極其龐大的一組資料,如此多資料採取什麼結構來表示和儲存,以及應用什麼演算法來對其排序,使該程式在排序時盡量的快,佔用的空間盡量的少。這都是學問,編程的學問!所以,我覺得,程式員對資料結構和演算法的領悟程度直接決定了他的編程水平的高低。那麼如何提高自己的水平呢?我們可以學習研究像C(C++)函數庫(API)裡的函數,或JFC(JAVA類庫)中的函數,這些函數實現都是非常有經驗的程式員編寫的,有著很好的運行效率。再者,就是數學的重要,我認為數學對程式的重要性體現在對演算法的支援上。像微積分思想,為電腦數值計算提供了理論指導;而資料結構和演算法來源與離散數學,線性代數和機率統計中的思想和方法。另外,像電腦密碼學,電腦圖形學,電腦多媒體都離不開數學。好的演算法需要數學工具來理論驗證,也需要數學來改進,來完善!那麼,物件導向又扮演什麼角色呢?說到底,我覺得物件導向思想的宗旨就是代碼重用。物件導向裡的三大概念:封裝,繼承,多態都是為了代碼重用。重用品質高的代碼,不但可以節省人力,而且極大提高了本身原程式的品質。比如,我要編寫一多功能計算機,我依據自己喜好設計了介面,在具體功能實現上我繼承了別人已經寫好的正確功能類,不但省去了自己寫的麻煩,而且也保證了該計算機的正確性,一舉兩得。物件導向思想在寫小程式時或許體現不出優越,但在中大型軟體開發時,它的無比威力便會體現出來。沒有作過中大型項目的人是不會感覺到物件導向思想的偉大。在這裡,我還是要強調一點,面......餘下全文>>
 
品質控制計劃編寫過程中的注意事項

1,、要針對具體的品質狀況,來制定切實有效、適合本公司的品質控制計劃。
2、要分步驟,具體地進行控制。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.