高質(zhì)量c++與c指南林銳博士_第1頁
高質(zhì)量c++與c指南林銳博士_第2頁
高質(zhì)量c++與c指南林銳博士_第3頁
高質(zhì)量c++與c指南林銳博士_第4頁
高質(zhì)量c++與c指南林銳博士_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

kto文件狀態(tài):林銳博士版本歷史版本/狀態(tài)V草稿文件V正式文件作者林銳林銳參與者起止日期2001-7-182001-7-24備注林銳起草林銳修正草稿中的錯誤前言..................................錄......................................6.................................................11版權(quán)和版本的聲明..............................................................11..................................................12.................................................13..................................................13.................................................15 對齊 18 注釋 20 第3章命名規(guī)則22共性規(guī)則...................................................................22......................................25.....................................26 第5章常量33 第6章函數(shù)設計36參數(shù)的規(guī)則...............返回值的規(guī)則...............................................................36..................................................37..................................................39 第7章內(nèi)存管理44 第8章C++函數(shù)的高級特性57 第9章類的構(gòu)造函數(shù)、析構(gòu)函數(shù)與賦值函數(shù)69 第10章類的繼承與組合78 第11章其它編程經(jīng)驗82 一些有益的建議.85參考文獻87附錄A:C++/C代碼審查表88C++/C試題..........................................................93C++/C試題的答案與評分標準...........................................97前言軟件質(zhì)量是被大多數(shù)程序員掛在嘴上而不是放在心上的東西!捏造的C++/C程序怎么會有那么多的毛病”別難過,作者只不過比你早幾年、多幾次驚慌而已。編程老手與高手的誤區(qū)展成為毛病特多卻常能自我臭美的群體。et(1)(1)真正的程序員沒有進度表,只有討好領(lǐng)導的馬屁精才有進度表,真正的程序員會讓領(lǐng)導提心吊膽。3)(3)真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當然也很難讀。和文盲才會干這事。。(6)(6)真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。員不接受團隊開發(fā)的理念,除非他自己是頭頭。序員的程序不會在第一次就正確運行,但是他們愿意守著機器進行若干個明他從昨晚一直干到現(xiàn)在。被當作優(yōu)點來欣賞。就象在武俠小說中,那些獨來獨往、不受約束且?guī)c邪氣的高手最令人場。我從讀大學到博士畢業(yè)十年來一直勤奮好學,累計編寫了數(shù)十萬行C++/C代碼。有這樣的苦勞和疲勞,我應該稱得上是編程老手了吧明我算得上是編程高手了吧可惜這種個人感覺不等于事實。意表面謙虛地向一位真正的軟件高手請教。他雖然從未涉足過3D圖形領(lǐng)域,卻在幾十分鐘內(nèi)指出該軟件多處重大設計錯誤。讓人感覺那套軟件是用紙糊的華麗衣服,扯一下掉一塊,了自己的軟件公司。年,重新溫習軟件設計的基礎(chǔ)知識。補修“內(nèi)功”之后,又覺得腰板硬了起來。博士畢業(yè)前太容易了吧錯!這么一個小不點的函數(shù),他從三個方面考查:(1)編程風格;(2)出錯處理;(3)算法復雜度分析(用于提高性能)。他還當?shù)靡蔡C囊了。我又好好地反省了一次。我把反省后的心得體會寫成文章放在網(wǎng)上傳閱,引起了不少軟件開發(fā)人員的共鳴。我因高質(zhì)量與生產(chǎn)率是軟件工程要解決的核心問題。高質(zhì)量程序設計是非常重要的環(huán)節(jié),畢竟軟件是靠編程來實現(xiàn)的。我們心目中的老手們和高手們能否編寫出高質(zhì)量的程序來就我的經(jīng)歷與閱歷來看,國內(nèi)大學的計算機教育壓根就沒有灌輸高質(zhì)量程序設計的觀念,教師們和學生們也很少自覺關(guān)心軟件的質(zhì)量。勤奮好學的程序員長期在低質(zhì)量的程序堆中滾爬,吃盡苦頭之后才有一些心得體會,長進極慢,我就是一例。T大學教育時就“先天不足”,豈能一到企業(yè)就突然實現(xiàn)質(zhì)的飛躍。試問有多少軟件開發(fā)人員對正確性、健壯性、可靠性、效率、易用性、可讀性(可理解性)、可擴展性、可復用性、兼容性、可移植性等質(zhì)量屬性了如指掌并且能在實踐中運用自如?!案哔|(zhì)量”可不是干活小心點就能實現(xiàn)的!(1)編程老手可能會長期用隱含錯誤的方式編程(習慣成自然),發(fā)現(xiàn)毛病后都不愿相信那是真的!(2)編程高手可以在某一領(lǐng)域?qū)懗鰳O有水平的代碼,但未必能從全局把握軟件質(zhì)量的方方領(lǐng)導們不敢相信這是真的。我做過現(xiàn)場試驗:有一次部門新進14名碩士生,在開歡迎真的不是我“心狠手辣”或者要求過高,而是很多軟件開發(fā)人員對自己的要求不夠高。要知道華為、上海貝爾、中興等公司的員工素質(zhì)在國內(nèi)IT企業(yè)中是比較前列的,倘若定義1:能長期穩(wěn)定地編寫出高質(zhì)量程序的程序員稱為編程老手。定義2:能長期穩(wěn)定地編寫出高難度、高質(zhì)量程序的程序員稱為編程高手。手。樣在國內(nèi)土生土長的程序員朋友們能夠做到:(1)知錯就改;(2)經(jīng)常溫故而知新;(3)堅持學習,天天向上。首先請做附錄B的C++/C試題(不要看答案),考查自己的編程質(zhì)量究竟如何。然后參分。 (1)如果你只得了幾十分,請不要聲張,也不要太難過。編程質(zhì)量差往往是由于不良習慣造成的,與人的智力、能力沒有多大關(guān)系,還是有藥可救的。成績越差,可以進步的空間就越大,中國不就是在落后中趕超發(fā)達資本主義國家嗎只要你能下決心改掉不良的編程習慣,第二次考試就能及格了。 (2)如果你考及格了,表明你的技術(shù)基礎(chǔ)不錯,希望你能虛心學習、不斷進步。如果你還沒有找到合適的工作單位,不妨到上海貝爾試一試。(3)如果你考出85分以上的好成績,你有義務和資格為你所在的團隊作“C++/C編程”培小組來。(4)如果你在沒有任何提示的情況下考了滿分,希望你能收我做你的徒弟。編程考試結(jié)束后,請閱讀本書的正文。準,寫字潦草,如果不改正,總有后悔的時候。編程也是同樣道理。覺得“野指針”寫得不錯,與我切磋了一把。可是過了兩周,他告訴我,他忙了兩天追查出一個Bug。議你閱讀并按照CMMI規(guī)范做事,讓自己的綜合水平上升一個臺階。上海貝爾的員工可以向部軟件工程研究小組索取CMMI有關(guān)資料,最好能參加培訓。三、版權(quán)聲明本書的大部分內(nèi)容取材于作者一年前的書籍手稿(尚未出版),現(xiàn)整理匯編成為上海貝爾網(wǎng)絡應用事業(yè)部的一個規(guī)范化文件,同時作為培訓教材。自己也是這么學來的。作者愿意公開本書的電子文檔。(1)讀者可以任意拷貝、修改本書的內(nèi)容,但不可以篡改作者及所屬單位。(2)未經(jīng)作者許可,不得出版或大量印發(fā)本書。(3)如果競爭對手公司的員工得到本書,請勿公開使用,以免發(fā)生糾紛。歡迎讀者對本書提出批評建議。為頭文件。另一個文件用于保存程序的實現(xiàn)(implementation),稱為定義(definition)義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。版權(quán)和版本的聲明版權(quán)和版本的聲明位于頭文件和定義文件的開頭(參見示例1-1),主要內(nèi)容有:(1)版權(quán)信息。(2)文件名稱,標識符,摘要。(3)當前版本號,作者/修改者,完成日期。(4)版本歷史信息。**Copyright(c)2001,上海貝爾有限公司網(wǎng)絡應用事業(yè)部*Allrightsreserved.***作者:輸入作者(或修改者)名字**原作者:輸入原作者(或修改者)名字/(1)頭文件開頭處的版權(quán)和版本聲明(參見示例1-1)。(2)預處理塊。(3)函數(shù)和類結(jié)構(gòu)聲明等。假設頭文件名稱為,頭文件的結(jié)構(gòu)參見示例1-2。f【規(guī)則1-2-2】用#include<>格式來引用標準庫的頭文件(編譯器將從標準庫目錄開始搜索)?!疽?guī)則1-2-3】用#include“”格式來引用非標準庫的頭文件(編譯器將從用戶的工作目錄開始搜索)?!窘ㄗh1-2-1】頭文件中只存放“聲明”而不存放“定義”在C++語法中,類的成員函數(shù)可以在聲明的同時被定義,并且自動成為內(nèi)聯(lián)函數(shù)。這,不論該函數(shù)體有多么小。voidFunc1(intx,inty,intz);Function();b->Function();從左至右!~++--(類型)sizeof從右至左+-*&*/%從左至右+-從左至右<<>>從左至右<<=>>=從左至右==!=從左至右&從左至右^從左至右|從左至右&&從左至右||從右至左:從右至左=+=-=*=/=%=&=^=從左至右|=<<=>>=word=(high<<8)|lowif((a|b)&&(a&c))書寫簡潔;(2)可以提高編譯效率。但要防止濫用復合表達式。4-2-1】不要編寫太復雜的復合表達式。i=a>=b&&c<d&&c+f<=g+h;確定優(yōu)先級。(4)對已經(jīng)存在的運算符進行重載時,不能改變優(yōu)先級規(guī)則,否則將引起混亂。用內(nèi)聯(lián)取代宏代碼C++語言支持函數(shù)內(nèi)聯(lián),其目的是為了提高函數(shù)的執(zhí)行效率(速度)。C可以用宏代碼提高執(zhí)行效率。宏代碼本身不是函數(shù),但使用起來象函數(shù)。返回參數(shù)、執(zhí)行return等過程,從而提高了速度。使用宏代碼最大的缺點是容易出錯,預處理器在復制宏代碼時常常產(chǎn)生意想不到的邊際效應。例如#defineMAX(a,b)(a)>(b)(a):(b)語句result=MAX(i,j)+2;將被預處理器解釋為result=(i)>(j)(i):(j)+2;result=((i)>(j)(i):(j))+2;如果把宏代碼改寫為#defineMAX(a,b)((a)>(b)(a):(b))則可以解決由優(yōu)先級引起的錯誤。但是即使使用修改后的宏代碼也不是萬無一失的,例如語句result=MAX(i++,j);將被預處理器解釋為result=(i++)>(j)(i++):(j);對于C++而言,使用宏代碼還有另一種缺點:無法操作類的私有數(shù)據(jù)成員。讓我們看看C++的“函數(shù)內(nèi)聯(lián)”是如何工作的。對于任何內(nèi)聯(lián)函數(shù),編譯器在符號表里放入函數(shù)的聲明(包括名字、參數(shù)類型、返回值類型)。如果編譯器沒有發(fā)現(xiàn)內(nèi)聯(lián)函數(shù)存用是否正確(進行類型安全檢查,或者進行自動類型轉(zhuǎn)換,當然對所有的函數(shù)都一樣)。如C++語言的函數(shù)內(nèi)聯(lián)機制既具備宏代碼的效率,又增加了安全性,而且可以自由操作類ugsert程風格inlinevoidFoo(intx,inty);ClineandGregA.Lomow,C++FAQs,Addison-Wesley,1995C00[Maguire]SteveMaguire,WritingCleanCode(編程精粹,姜靜波等譯),電子工業(yè)出[Meyers]ScottMeyers,EffectiveC++,Addison-Wesley,1992[Murry]RobertB.Murry,C++StrategiesandTactics,Addison-Wesley,1993[Summit]SteveSummit,CProgrammingFAQs,Addison-Wesley,1996重要性審查項結(jié)論理構(gòu)是否合理版權(quán)和版本聲明是否完整ifndefdefine/endif預處理塊頭文件中是否只存放“聲明”而不存放“定義”程序的版式重要性審查項結(jié)論格是否得體“{”和“}”是否各占一行并且對齊于同一列在定義變量(或參數(shù))時,是否將修飾符*和&緊靠注釋是否清晰并且必要注釋是否有錯誤或者可能導致誤解public,protected,private順序是否在所有序中保持一致規(guī)則重要性審查項結(jié)論命名規(guī)則是否與所采用的操作系統(tǒng)或開發(fā)工具的風格保持一致標識符是否直觀且可以拼讀標識符的長度應當符合“min-length&&程序中是否出現(xiàn)相同的局部變量和全部變量表達式與基本語句重要性審查項結(jié)論重要如果代碼行中的運算符比較多,是否已經(jīng)用括號清楚地確者多用途的復合表達式是否將復合表達式與“真正的數(shù)學表達式”混淆的外面使用goto語句時是否留下隱患例如跳過了某些對象的構(gòu)造、變量的初始化、重要的計算等。是否使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串是否誤解了類中的const數(shù)據(jù)成員因為const數(shù)據(jù)成員只參數(shù)的書寫是否完整不要貪圖省事只寫參數(shù)的類型而省字。參數(shù)命名、順序是否合理參數(shù)的個數(shù)是否太多是否使用類型和數(shù)目不確定的參數(shù)是否省略了函數(shù)返回值的類型函數(shù)名字與返回值類型在語義上是否沖突是否將正常值和錯誤標志混在一起返回正常值應當用輸使用濫用了assert例如混淆非法情況與錯誤情況,后者是必然存在的并且是一定要作出處理的。用”是否使用const提高函數(shù)的健壯性const可以強制保護函值,甚至函數(shù)的定義體。“Useconstwheneveryouneed”是否忘記為數(shù)組和動態(tài)內(nèi)存賦初值(防止將未被初始化的數(shù)組或指針的下標是否越界動態(tài)內(nèi)存的申請與釋放是否配對(防止內(nèi)存泄漏)是否有效地處理了“內(nèi)存耗盡”問題是否修改“指向常量的指針”的內(nèi)容是否出現(xiàn)野指針例如(1)指針變量沒有被初始化。temalloc語句是否正確無誤例如字節(jié)數(shù)是否正確類型轉(zhuǎn)換正確無誤C++函數(shù)的高級特性重要性審查項義性是否混淆了成員函數(shù)的重載、覆蓋與隱運算符的重載是否符合制定的編程規(guī)范是否用內(nèi)是否違背編程規(guī)范而讓C++編譯器自動為類產(chǎn)生四個缺構(gòu)造函數(shù);(3)缺省的析構(gòu)函數(shù);(4)缺省的賦值函數(shù)。構(gòu)造函數(shù)中是否遺漏了某些初始化工作是否正確地使用構(gòu)造函數(shù)的初始化表析構(gòu)函數(shù)中是否遺漏了某些清除工作是否錯寫、錯用了拷貝構(gòu)造函數(shù)和賦值函數(shù)查自賦值;(2)釋放原內(nèi)容;(4)(1)派生類不可能繼承基類的構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦(2)派生類的構(gòu)造函數(shù)應在其初始化表里調(diào)用基類的構(gòu)(3)基類與派生類的析構(gòu)函數(shù)應該為虛(即加virtual(4)在編寫派生類的賦值函數(shù)時,注意不要忘記對基類重要性審查項結(jié)論重要是否違背了繼承和組合的規(guī)則重要性審查項結(jié)論重要數(shù)據(jù)類型問題:(1)變量的數(shù)據(jù)類型有錯誤嗎(2)存在不同數(shù)據(jù)類型的賦值嗎(3)存在不同數(shù)據(jù)類型的比較嗎(1)變量的初始化或缺省值有錯誤嗎(2)變量發(fā)生上溢或下溢嗎(3)變量的精度夠嗎(1)由于精度原因?qū)е卤容^無效嗎(2)表達式中的優(yōu)先級有誤嗎(3)邏輯判斷結(jié)果顛倒嗎(1)循環(huán)終止條件不正確嗎(2)無法正常終止(死循環(huán))嗎(3)錯誤地修改循環(huán)變量嗎(4)存在誤差累積嗎(1)忘記進行錯誤處理嗎(2)錯誤處理程序塊一直沒有機會被運行(3)錯誤處理程序塊本身就有毛病嗎如報告的錯誤與實際錯誤不一致,處理方式不正確等等。(1)對不存在的或者錯誤的文件進行操作嗎(2)文件以不正確的方式打開嗎(3)文件結(jié)束判斷不正確嗎(4)沒有正確地關(guān)閉文件嗎但不能反映考生的智力和軟件開發(fā)能力。ntn請寫出請寫出BOOLflag與“零值”比較的if語句:請寫出floatx與“零值”比較的if語句:請寫出char*p與“零值”比較的if語句:voidvoidFunc(char{請計算sizeof(str}void*p=malloc(100);請計算sizeof(p)=charstr[]=“Hello”;char*p=str;tn請計算sizeof(p)=sizeof(n)=sizeof(str)=str[100]))=三、簡答題(25分)1、頭文件中的ifndef/define/endif干什么用2、#include<>和#include“”有什么區(qū)別3、const有什么用途(請至少說明兩種)4、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern“C”聲明5、請簡述以下兩個for循環(huán)的優(yōu)缺點//第一個for(i=0;i<N;i++){DoSomething();lseDoOtherthing();}//第二個{for(i=0;i<N;i++)DoSomething();}lse{for(i=0;i<N;i++)DoOtherthing();}四、有關(guān)內(nèi)存的思考題(20分)voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;char*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){GetMemoryGetMemory(str);strcpy(str,"helloworld");printf(str);}char*str=NULL;str=GetMemory();printf(str);}VoidGetMemory2(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"hello");printf(str);}voidTest(void){char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);{strcpy(str,“world”);printf(str);}}char*strcpy(char*strDest,constchar*strSrc);(1)不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù)strcpy六、編寫類String的構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)(25分)classString{public:String(constchar*str=NULL);//普通構(gòu)造函數(shù)String(constString&other);~String(void);//拷貝構(gòu)造函數(shù)//析構(gòu)函數(shù)String&operate=(constString&other);//賦值函數(shù)private:char*m_data;//用于保存字符串iffif(flag)if(flag==TRUE)if(!flag)if(flag==1)agFALSEconstfloatEPSINON=;如下是錯誤的寫法,不得分。if((x>=-EPSINON)&&(x<=EPSINON)if(x==較,應該設法轉(zhuǎn)化成“>=”或“<=”此類形if(p==NULL)if(p==0)if(p!=NULL)if(p!=0)(2(2分)voidFunc(char{請計算sizeof(str}str[100]))=4(2分)void*p=malloc(100);請計算sizeof(p)=4charstr[]=“Hello”;char*p=str;tn請計算sizeof(str)=6sizeof(p)=4sizeof(n)=4(2分)(2分)(2分)三、簡答題(25分)1、頭文件中的ifndef/define/endif干什么用(5分)答:防止該頭文件被重復引用。2、#include<>答:對于#include對于#include和#include“”有什么區(qū)別(5分)<>,編譯器從標準庫路徑開始搜索“”,編譯器從用戶的工作路徑開始搜索3、const有什么用途(請至少說明兩種)(5分)答:(1)可以定義const常量(2)const可以修飾函數(shù)的參數(shù)、返回值,甚至函數(shù)的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。4、在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern“C”(5分)語言的不同。假設某個函數(shù)的原型為:voidfoo(intx,inty);C++提供了C連接交換指定符號extern“C”來解決名字匹配問題。forfor(i=0;i<N;i++){DoSomething();lseDoOtherthing();}優(yōu)點:程序簡潔斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進行優(yōu)化處理,降低了效率。{for(i=0;i<N;i++)DoSomething();}lse{for(i=0;i<N;i++)DoOtherthing();}優(yōu)點:循環(huán)的效率高缺點:程序不簡潔charchar*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){char*str=NULL;voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpystrcpy(str,"helloworld");printf(str);}str=GetMemory();printf(str);}strcpy(str,"helloworld");將使程序崩voidGetMemory2(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"hello");printf(str);}(1)能夠輸出hello(2)內(nèi)存泄漏碼。內(nèi)容已經(jīng)被清除,新內(nèi)容不可知。voidTest(void){char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);{strcpy(str,“world”);printf(str);}}if(str!=NULL)語句不起作用。char*strcpy(char*strDest,constchar*strSrc);(1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論