高質(zhì)量
C++/C
編程指南
—
讀后感
乾
2005-9-21
???
讀了前言,感觸頗深,以前一直認(rèn)為只要會(huì)編程,能夠?qū)崿F(xiàn)所要求的功能就可以算的上是一個(gè)合格的程序員了,然而今天才了解到,并沒有這么簡(jiǎn)單,就以個(gè)小小的函數(shù)而言,它實(shí)現(xiàn)的只是一個(gè)功能,但是對(duì)一個(gè)合格的程序員來(lái)說(shuō)卻需要注意很多問(wèn)題:首先是編程風(fēng)格,一段整齊的代碼可讀性強(qiáng),在適當(dāng)?shù)牡胤郊由显敿?xì)的注釋,讓別人充分理解你的程序,如果一段程序只有編寫者自己才能讀懂,這段程序只能說(shuō)是很失敗的程序;其次是異常處理,每一個(gè)輸入輸出都可能產(chǎn)生異常,而異常則會(huì)導(dǎo)致程序的崩潰或者輸出結(jié)果與預(yù)期的值不符合,程序要如何保證對(duì)各種各樣異常的處理,如何保證程序運(yùn)行的正確性,這一點(diǎn)也非常重要;還有對(duì)算法的復(fù)雜度的設(shè)計(jì),同樣的功能,不同的算法可能產(chǎn)生不同的效率,所需的資源也可能有差別,不能只是認(rèn)為簡(jiǎn)單的實(shí)現(xiàn)了功能就萬(wàn)事大吉了,要好好的思考一下如何才能提高程序的效率,要設(shè)計(jì)高效率的程序。
??? 第一章主要講文件的結(jié)構(gòu),文件應(yīng)該定義兩個(gè)部分,頭文件和定義文件,在前面還要再加上版權(quán)和版本的聲明。以前自己寫程序都是所有的東西都寫在一個(gè)文件中,包括頭文件,定義文件,這樣,文件的結(jié)構(gòu)不是很清楚,而且在代碼多的時(shí)候更加覺的很繁瑣,而將這兩個(gè)文件分開定義則都很分明,在都文件中都是定義的部分,而在定義文件中寫程序的實(shí)現(xiàn)體,這樣是比較清晰的,在項(xiàng)目大的時(shí)候會(huì)用到目錄結(jié)構(gòu),需要更加注意。
??? 第二章講程序的版式,覺的這部分很重要,這是一個(gè)習(xí)慣問(wèn)題,空行和空格不會(huì)浪費(fèi)內(nèi)存,但是卻可以使得程序結(jié)構(gòu)清晰,其實(shí)編程也是一種藝術(shù),清晰的代碼會(huì)給人很輕松的感覺,而煩亂的代碼會(huì)使人容易厭倦,不想再讀下去!變量初始化最好采用就近原則,負(fù)責(zé)容易忘記,要養(yǎng)成對(duì)齊的好習(xí)慣,長(zhǎng)行需要拆分,太長(zhǎng)會(huì)不方便閱讀,要記得注釋,我最近作的兩個(gè)例子中都很少加注釋,清晰的注釋更容易讓別人理解你的程序,所以一定要加注釋,而且盡量要注釋清楚。類中定義順序最好先定義public函數(shù),再定義private數(shù)據(jù),不過(guò)我的習(xí)慣剛好相反,所以這方面需要注意。
??? 第三章講名規(guī)則,大多數(shù)公司或者項(xiàng)目組都會(huì)又自己的命名規(guī)則,不過(guò)有一些共有的,在本章有所介紹,我在編程的過(guò)程中,經(jīng)常會(huì)用到i,j等局部變量,而且很多都只是很簡(jiǎn)單的字母,這個(gè)習(xí)慣很不好,這樣代碼的可讀性差,所以要注意命名,要用英文單詞的組合讓函數(shù)或者參數(shù)從名字上就可以知道他們的作用或者意義,這一點(diǎn)值得注意,這也是需要養(yǎng)成的習(xí)慣。
??? 第四章講表達(dá)式和基本語(yǔ)句,布爾類型與零值的比較要用if(flag)或者在flag前加!表示false,它不應(yīng)與具體的值比較,整形值比較用==(!=),用=表示賦值,浮點(diǎn)型比較:if ((x>=-EPSINON) && (x<=EPSINON))其中EPSINON 是精度,不要與0.0比較,指針應(yīng)該與NULL比較。使用三元運(yùn)算符可以使程序更簡(jiǎn)潔!循環(huán)要考慮到效率,寫法的不同可能導(dǎo)致效率差別很大,要采用高效的循環(huán)方式!還有一些小的細(xì)節(jié)需要注意,在文章中都有詳細(xì)的說(shuō)明。
??? 第五章講常量,常量用起來(lái)是很方便的,但是在類中const 數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進(jìn)行,這點(diǎn)值得注意,在類中還要注意枚舉常量的使用!
??? 第六章函數(shù)設(shè)計(jì),需要注意的幾點(diǎn):1.輸入?yún)?shù)值傳遞,用const &方式提高效率;2.盡量用引用傳遞,但是在某些場(chǎng)合必須要用值傳遞,視情況而定;3.返回值的使用,不能返回指向“棧內(nèi)存”的“指針”或者“引用”,返回對(duì)象時(shí)要考慮到效率;4.函數(shù)要短小精悍,功能單一,盡量少用static,要用assert這個(gè)利器進(jìn)行測(cè)試;5.指針和引用的使用,我在學(xué)習(xí)C++的時(shí)候,對(duì)指針就不是很了解,沒有掌握指針的用法,現(xiàn)在還在學(xué)習(xí),不過(guò)應(yīng)該盡量使用引用,盡量避免指針的一些特殊用法。
??? 第七章講內(nèi)存管理,這個(gè)部分是個(gè)難點(diǎn),對(duì)內(nèi)存的管理非常靈活,但是問(wèn)題也是非常多的,很容易就會(huì)出現(xiàn)很多的問(wèn)題。1.內(nèi)存分配之后加assert(p!=NULL),或者在用new申請(qǐng)內(nèi)存時(shí)用if(p==NULL)或if(p!=NULL)進(jìn)行防錯(cuò)處理;2.申請(qǐng)完內(nèi)存之后馬上進(jìn)行初始化,這一點(diǎn)要養(yǎng)成習(xí)慣;3.內(nèi)存使用完后,釋放內(nèi)存,這點(diǎn)對(duì)以前使用java的我尤為重要,以前在java機(jī)制中,不需要釋放內(nèi)存,由java的機(jī)制自動(dòng)回收,但是vc++不同,需要釋放資源,以免內(nèi)存泄漏;4.釋放內(nèi)存之后,將指針設(shè)置為NULL,防止產(chǎn)生“野指針”;5.指針和數(shù)組內(nèi)容的復(fù)制要用strcpy函數(shù),不能用==,而比較要用strcmp;6.內(nèi)存容量用sizeof獲取;7.不能用指針申請(qǐng)動(dòng)態(tài)內(nèi)存,要用指針的指針或者用函數(shù)的返回值來(lái)傳遞動(dòng)態(tài)的內(nèi)存;8.free和delete只是釋放內(nèi)存,并沒有把指針本身干掉;9.“野指針”是指向“垃圾內(nèi)存的指針”,指針操作超越了變量的作用范圍會(huì)產(chǎn)生“野指針”;10.
malloc/free不能用在構(gòu)造函數(shù)和析構(gòu)函數(shù)中,在這里要用到new/delete;11.一般情況下,不會(huì)出現(xiàn)內(nèi)存耗盡的問(wèn)題,不過(guò)高質(zhì)量的程序還是應(yīng)該考慮到這個(gè)問(wèn)題。總的來(lái)說(shuō),本章是個(gè)重點(diǎn),指針的使用是一大難點(diǎn),要學(xué)會(huì)使用指針,有效的使用指針可以提到程序的效率,指針雖然容易出錯(cuò),但是卻非常的靈活,正確使用非常重要。
第八章講C++的高級(jí)特性,了解了一下的特性:1.重載簡(jiǎn)言之就是函數(shù)名相同,參數(shù)不同(作用域要相同);2. 當(dāng)心隱式類型轉(zhuǎn)換導(dǎo)致重載函數(shù),有些值,系統(tǒng)不知道要轉(zhuǎn)換成什么類型,所以要對(duì)其進(jìn)行顯式轉(zhuǎn)換,這樣不至于得到意料之外的結(jié)果;3.在覆蓋和重載的時(shí)候經(jīng)常會(huì)遇到隱藏,很容易搞混亂,解決方法載文章中有,覆蓋必須要有virtual關(guān)鍵字;4. 參數(shù)缺省值只能出現(xiàn)在函數(shù)的聲明中,而不能出現(xiàn)在定義體中,函數(shù)有多個(gè)參數(shù),參數(shù)只能從后向前挨個(gè)兒缺省;5.運(yùn)算符的重載,比較難,不要輕易使用;6. 關(guān)鍵字inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),只放在聲明處不能,類聲明之中的成員函數(shù)將自動(dòng)地成為內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)是以內(nèi)存為代價(jià)的,慎用內(nèi)聯(lián)。
第九章講構(gòu)造函數(shù)等內(nèi)容,有以下的收獲:1.構(gòu)造函數(shù)負(fù)責(zé)對(duì)象的創(chuàng)建,用于初始化成員變量,析構(gòu)函數(shù)用于銷毀對(duì)象,在構(gòu)造函數(shù)中要注意初始化列表的使用;2.拷貝構(gòu)造函數(shù)和賦值函數(shù)較難寫,需要在使用中進(jìn)一步理解體會(huì)。本章的內(nèi)容與類有關(guān),在以后的編碼過(guò)程中需要多加注意。
第十章講類的繼承和組合,類的繼承體現(xiàn)的面相對(duì)象的編程思想,提倡使用,但是在一些情況下需要用到組合,要注意編程的設(shè)計(jì)方法,不要覺得代碼正確就可以了,要用正確的設(shè)計(jì)方法,編寫出高質(zhì)量的程序。
第十一章講其他的編程經(jīng)驗(yàn),const的用法有很多,它不僅僅定義一個(gè)常量,還可以定義函數(shù),const函數(shù)不允許修改數(shù)據(jù)成員和調(diào)用非const成員函數(shù)。在后面還列出了很多需要注意的技巧,在編程的過(guò)程中因該嚴(yán)格執(zhí)行,養(yǎng)成好的編程習(xí)慣。
附錄以及習(xí)題是對(duì)文章中的內(nèi)容的總結(jié)和檢測(cè)。
??? 以上是對(duì)本文的理解和對(duì)關(guān)鍵點(diǎn)的記錄,這本書可以作為一個(gè)規(guī)范,隨時(shí)翻翻,應(yīng)該按照里面提到的各種規(guī)則嚴(yán)格要求自己,在以后的編程中形成一種良好的編程習(xí)慣,這樣才能編出高質(zhì)量的程序。