




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、普通程序員應該做到:( 1)知錯就改;( 2)經(jīng)常溫故而知新;( 3)堅持學習,天天向上。C+/C 程序通常分為兩個文件:1. Declaration 保存程序的聲明( .h )2. Implementation 保存程序的實現(xiàn)(.c )頭文件的作用:通過頭文件來調(diào)用庫功能;加強類型安全檢查。頭文件一般保存于include 目錄,定義文件按保存于source 目錄。版式:一行代碼值做一件事情。盡可能在定義變量的同時初始化該變量。代碼行最大長度宜控制在70 至 80 字符以內(nèi)。類的版式:以行為為中心,重點關(guān)注是類應該提供什么樣的接口(服務), public 類型的函數(shù)寫在前面,private 類
2、型的數(shù)據(jù)寫在后面。命名規(guī)則:匈牙利法:在變量和函數(shù)名中加入前綴以增進人們對程序的理解。( ppch: 指向字符指針的指針)Windows應用程序的標示符通常采用大小寫混排的方式,如 AddChildUnix 應用程序的標示符通常采用小寫加下劃線的方式,如add_child.表達式與基本語句(別用隱含錯誤的方式寫代碼)不可將布爾變量直接與 TRUE,FALS或者1, 0進行比較,不同編譯器的bool值是不同的不可將浮點變量用“=”或“!=”與任何數(shù)字比較,因為有精度限制。應當將指針變量用“="或"!=”與 NULL比較。循環(huán)語句的效率(降低循環(huán)的復雜性)多重循環(huán)中,如有可能,
3、應當將最長的循環(huán)放在最內(nèi)層。如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,最好將邏輯判斷移到循環(huán)體外面。Switch 語句存在的理由:多分支選擇語句,雖然可以用嵌套if 語句來實現(xiàn)多分支選擇,但那樣程序冗長難讀。Switch 語句中每個case 語句不要忘了加break 。不要忘記default 分支,即使不需要,也要保留default : break ;常量:值在運行期間恒定不變。C語言中用#define來定義常量(稱為宏常量),C+中除了 #define外,還可以用 const 來定義常量( const 常量) 。Const 與 #define 比較:Const 優(yōu)點: 1.Const 常量
4、有數(shù)據(jù)類型,宏常量沒有數(shù)據(jù)類型。2. 有些集成化的調(diào)試工具可以對Const 常量進行調(diào)試,但不能對宏常量調(diào)試在C+中只使用const常量而不使用宏常量。需要對外公開的常量放在頭文件中,不需要對外公開的常量放在定義文件的頭部。為便于管理,可以把同模塊的常量集中存放在一個公共的頭文件中。類中的常量:只能用枚舉常量來實現(xiàn)! Const 數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量,而對整個類而言卻是可變的,因為類可以創(chuàng)建多個對象,不同的對象其const 數(shù)據(jù)成員的值可以不同。 不能在類聲明中初始化const 數(shù)據(jù)成員,因為類的對象未被創(chuàng)建時,編譯器不知道值是什么。 Const 數(shù)據(jù)成員的初始化,只能在類構(gòu)造函
5、數(shù)的初始化表中實現(xiàn)。函數(shù)設(shè)計函數(shù)接口的兩個要素是參數(shù)和返回值:C 語言中,函數(shù)的參數(shù)和返回值的傳遞方式有兩種;值傳遞和指針傳遞,C+多了引用傳遞。引用傳遞:性質(zhì)像指針傳遞,而使用方式卻像值傳遞。參數(shù)的規(guī)則:參數(shù)的書寫要完整,如果函數(shù)沒有參數(shù),用void 填充。參數(shù)命名要恰當,順序要合理。(目的參數(shù)放在前面,源參數(shù)放在后面)。如果參數(shù)是指針,且僅作輸入用,應在類型前加Const ,以防止該指針在函數(shù)體外被修改。如果輸入?yún)?shù)以值傳遞的方式傳遞對象,宜改用“Const & ”,省去零時對象的構(gòu)造和析構(gòu)過程,提高效率。參數(shù)個數(shù)盡量控制在5 個以內(nèi)。盡量不要使用類型和數(shù)目不確定的參數(shù)。返回值的規(guī)
6、則:不要省略返回值的類型。函數(shù)名字和返回者類型在語義上不可沖突。( getChar 其實 int 類型,而不是Char 類型)不要將正常值和錯誤標志混在一起返回,正常值用輸出參數(shù)獲得,錯誤標志用return 語句返回。有時候函數(shù)原本不需要返回值,但為了增加靈活性,可以附加返回值。函數(shù)內(nèi)部實現(xiàn)的規(guī)則:(在函數(shù)體的入口處和出口處把關(guān))在函數(shù)體的入口處,對參數(shù)的有效性進行檢查,從分理解并正確使用“斷言”( assert ) 在函數(shù)體的出口處,對return 語句的正確性和效率進行檢查。1. return 語句不可返回指向“棧內(nèi)存”的指針或者引用,因為該內(nèi)存在函數(shù)體結(jié)束時被自動銷 毀。2. 搞清楚返回
7、的究竟是值,指針還是引用。3. 如果函數(shù)返回值是一個對象,要考慮return 語句的效率。4. 函數(shù)體功能要單一,不要設(shè)計多用途的函數(shù);函數(shù)體的規(guī)模要小,盡量控制在50 行代碼以內(nèi);盡量避免函數(shù)帶有“記憶”功能。Debug版本release版本的區(qū)別:debug版本用于內(nèi)部調(diào)試,release版本發(fā)型給用戶使用。斷言 assert 是僅在 debug 版本起作用的宏,用于檢查“不應該”發(fā)生的情況。使用斷言捕捉不應該發(fā)生的非法情況;在函數(shù)的入口處,使用斷言檢查參數(shù)的有效性。引用與指針的比較引用是C+中的概念。1. 引用被創(chuàng)建的同時必須被初始化(指針則可以在任何時候被初始化)。2. 不能有NULL
8、引用,引用必須與合法的存儲單元關(guān)聯(lián)(指針則可以使 NULL)。3. 一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時改變所指的對象)。4. 引用的主要功能是傳遞函數(shù)的參數(shù)和返回值。內(nèi)存管理內(nèi)存是片雷區(qū),需要細心閱讀,做到真正通曉內(nèi)存!發(fā)生內(nèi)存錯誤是非常麻煩的事情,編譯器不能自動發(fā)現(xiàn)這些錯誤,通常在程序運行時才能捕捉到。大多沒有明顯的癥狀,時隱時現(xiàn)。內(nèi)存分配方式(三種)1. 從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在。如全局變量,static 變量。2. 在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲
9、單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但內(nèi)存容量有限。3. 從堆上分配,即所謂的動態(tài)內(nèi)存分配。程序在運行時用 malloc或new申請任意多少的內(nèi)存,程序員自己動手用free 或 delete 釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定,使用靈活,但問題也最多。常見的內(nèi)存錯誤及其對策:1. 內(nèi)存分配未成功,卻使用了它。新手犯的。解決辦法:在使用內(nèi)存錢檢查指針是否為NULL,如果指針 P是函數(shù)的參數(shù),那在函數(shù)入口處用assert (p! =null )進行檢查。如果是用 malloc或new來申請內(nèi)存,用if (p=NULL)或if (p!=NULD來進行防錯處理。2. 內(nèi)存
10、分配雖然成功,但沒有初始化就引用它。(沒有初始化的概念,或者誤以為內(nèi)存缺省值為0)解決辦法:無論用何種方式創(chuàng)建數(shù)組,都別忘了賦初值,即便是賦0 值也不可省略。3. 內(nèi)存分配成功且已經(jīng)初始化,但操作越界例如在使用數(shù)組時常發(fā)生下標“多1”或“少1”,尤其是for 循環(huán)中,要慎重。4. 忘記了釋放內(nèi)存,造成內(nèi)存泄漏。含有這種錯誤的函數(shù)每被調(diào)用一次就丟失一塊內(nèi)存。系統(tǒng)會顯示“內(nèi)存耗盡”解決辦法:動態(tài)內(nèi)存的申請與釋放必須配對,程序中malloc 與 free 的使用次數(shù)一定要相同,否則肯定有錯誤(new/delete ) 。5. 釋放了內(nèi)存卻繼續(xù)使用它。1程序中的對象調(diào)用關(guān)系過于復雜。這是數(shù)據(jù)結(jié)構(gòu)設(shè)計問
11、題,要重新設(shè)計一下。ii return 語句寫錯了,注意不要返回指向“棧內(nèi)存”的指針和引用,那個東西在函數(shù)體結(jié)束時被自動銷毀的!iii使用free或delete釋放了內(nèi)存后,沒有將指針設(shè)置為NULL導致“里?指針”,規(guī)則:1.用malloc或new申請內(nèi)存之后,立即檢查指針是否為NULL.2. 為數(shù)組和動態(tài)內(nèi)存賦初值。3. 避免數(shù)組或指針的下標越界,特別要當心“多1”或者“少1”4. 動態(tài)內(nèi)存的申請和釋放必須配對,防止內(nèi)存泄漏(malloc/free ) ( new/delete )5. 用free或delete釋放內(nèi)存之后,立即將指針設(shè)置為NULL,防止產(chǎn)生“野指針”指針和數(shù)組的對比:數(shù)組要
12、么在靜態(tài)存儲區(qū)被創(chuàng)建(全局數(shù)組), 要么在棧上被創(chuàng)建。數(shù)組名對應著一塊內(nèi)存(而不是指向),其地址與容量在生命期內(nèi)保持不變,只有數(shù)組的內(nèi)容可以改變。指針可以隨時指向任意類型的內(nèi)存塊,它的特征是“可變”,所以我們常用指針來操作動態(tài)內(nèi)存。若想把數(shù)組a的內(nèi)容復制給數(shù)組 b,不能用b=a,用標準庫函數(shù)strcpy進行復制;比較b和a的內(nèi)容 是否相同,不能用b=a 來判斷,用標準庫函數(shù)strcmp 進行比較。P=a并不能把a的內(nèi)容復制給指針 p,而是把a的地址賦給了 p。得先用malloc為p申請一塊容量為 strlen ( a) +1 個字符的內(nèi)存,在用strcpy 進行字符串復制。用運算符sizeof
13、 可以計算出數(shù)組的容量,字節(jié)數(shù)。但sizeof 指針,只能告訴你指針類型的大小,而不是它所致的內(nèi)存的容量。C+/c 沒有辦法知道指針所致的內(nèi)存容量的。Win32 位系統(tǒng),所有的指針都是4位的。 Char 是 1 位, int , float 是 4 位, double 是 8 位。注意:當數(shù)組作為函數(shù)的參數(shù)進行傳遞時,該數(shù)組自動退化為同類型的指針。Free 和 delete 只是把指針所指的內(nèi)存給釋放掉,但并沒有把指針本身干掉。指針被 free 以后其地址仍然不變(非NULL) ,只是該地址對應的內(nèi)存是垃圾,成了所謂的“野指針”,如果這時候不把該指針設(shè)置為NULL,會讓人誤以為它是個合法的指針
14、。對于野指針,if (p! =NULD起不到防錯作用,因為即便p不是NULL指針,它也不指向合法的內(nèi)存塊?!耙爸羔槨辈皇荖ULL指針,是指向“垃圾”內(nèi)存的指針。 If語句對它不起作用。生成野指針的原因:1. 指針變量沒有被初始化。如果被創(chuàng)建時沒有初始化指針,它會亂指一氣。因此在指針變量創(chuàng)建時要初始化,要么設(shè)置為NULL,要么讓它指向合法的內(nèi)存。2. 指針被free或者delete之后,沒有置為 NULL讓人誤以為它是個合法的指針。3. 指針操作超越了變量的作用范圍。Malloc/free 和 new/delete 的區(qū)別。 ( c 程序只能用malloc/free 管理動態(tài)內(nèi)存)Malloc與
15、free是c+/c語言的標準庫函數(shù),new/delete 是C+的運算符。他們都可以用于申請動態(tài)內(nèi)存和釋放內(nèi)存。對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用malloc/free 無法滿足動態(tài)對象的要求。因為對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),消亡之前要自動執(zhí)行析構(gòu)函數(shù)。而malloc/free 是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限之內(nèi),不能把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務強加于malloc/free.因此C+需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以及一個能完成清理與釋放內(nèi)存工作的運算符delete 。所以,不要企圖用malloc/free 來完成動態(tài)對象的內(nèi)存管理,應該用new/de
16、lete. 而由于內(nèi)部數(shù)據(jù)類型的“多項”沒有構(gòu)造和析構(gòu)的過程,對它們而言 malloc/free 和 new/dekete 式等價的。處理內(nèi)存耗盡問題。如果申請動態(tài)內(nèi)存時找不到足夠大的內(nèi)存塊,malloc和new將返回NULL指針,宣告內(nèi)存申請失敗。處理方法:1.判斷指針是否為NULL,如果是則馬上用return語句終止本函數(shù)。2 .判斷指針是否為NULL,如果是則馬上用exit (1)終止整個程序的運行。3 .為new和malloc設(shè)置異常處理函數(shù)。Malloc/free 的使用要點Malloc 原型: void* malloc(size_t size); 例: int *p=(int *)
17、malloc(sizeof(int) * length);在malloc 中使用 sizeof 是良好的編程風格。Free原型:void free(void* memblock);如果不是 NULL指針,那么free對p的連續(xù)操作兩次就會導致程序運行錯誤;如果 p是NULL指針,那么無論操作多少次都不回出問題。Mew/delete 的使用要點New int *p2=new intlength; 因為new內(nèi)置了 sizeof、類型轉(zhuǎn)換和類型檢查功能。對非內(nèi)部數(shù)據(jù)類型的對對象,new 同時完成了初始化工作。Delete :用 delete 釋放對象數(shù)組的時候,不要隨意掉了符號 ,例如 delet
18、e objects;對指針需要做的:越是怕指針,也是要使用指針。不會正確使用指針,肯定算不上合格的程序員。必須養(yǎng)成“使用調(diào)試器逐步跟蹤程序”的習慣,只有這樣才能發(fā)現(xiàn)問題的本質(zhì)。C+函數(shù)的高級特性對比與C語言的函數(shù),C+曾加了重載(overloaded ),內(nèi)聯(lián)(inline ), const和virtual四種新機制。重載和內(nèi)聯(lián)機制既可以用于全局函數(shù)也可用以類的成員函數(shù)。Const 與 virtual 機制僅用于類的成員函數(shù)。C+鏘序要調(diào)用已經(jīng)被編譯后的C函數(shù),通過extern"C'解決:#ifdef _cplusplus extern “ C” #endif/ 加 c 函數(shù)
19、#ifdef _cplusplus#endif重載:在C+例序中,可以將語義、功能相似的幾個函數(shù)用同一個名字表示,即函數(shù)重載。 優(yōu)點(理由):便于記憶,提高函數(shù)的易用性;類的構(gòu)造函數(shù)需要重載機制。因為C+砌定構(gòu)造函數(shù)與類同名,構(gòu)造函數(shù)只能有一個名字。通過參數(shù)的不同來區(qū)分重載函數(shù)。由于數(shù)字本身沒有類型,將數(shù)字當作參數(shù)時將自動進行類型轉(zhuǎn)換,成為隱式類型轉(zhuǎn)換。成員函數(shù)的重載、覆蓋與隱藏:容易混淆!成員函數(shù)被重載的特征:1. 相同的范圍(在同一類中); 2. 函數(shù)名字相同;2. 參數(shù)不同;4. virtual關(guān)鍵字可有可無。覆蓋時指派生類函數(shù)覆蓋基類函數(shù),特征: 1. 不同的范圍(分別位于派生類和基類
20、); 2. 函數(shù)名字相同; 3. 參數(shù)相同;4. 基類函數(shù)必須有virtual 關(guān)鍵字。運算符重載在C+中,可以用operator加上運算符來表示函數(shù),叫做運算符重載。函數(shù)內(nèi)聯(lián):C+語言支持函數(shù)內(nèi)聯(lián),其目的是為了提高函數(shù)的執(zhí)行效率。C+ 語言的函數(shù)內(nèi)聯(lián)機制既具備宏代碼的效率,又增加了安全性,而且可以自由操作類的數(shù)據(jù)成員。所以在C+例序中,應該用內(nèi)聯(lián)函數(shù)取代所有宏代碼,“ assert ”是唯一的例外。 關(guān)鍵字 inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián), 僅將 inline 放在函數(shù)聲明前面不起任何作用。類的構(gòu)造函數(shù)、析構(gòu)函數(shù)與賦值函數(shù)構(gòu)造函數(shù)、析構(gòu)函數(shù)與賦值函數(shù)是每個類最基本的
21、函數(shù)。每個類只有一個析構(gòu)函數(shù)和賦值函數(shù),但可以有多個構(gòu)造函數(shù)(包含一個拷貝構(gòu)造函數(shù),其他的普通構(gòu)造函數(shù)) 。C+琳言里,把對象的初始化工作放在構(gòu)造函數(shù)中,把清除工作放在析構(gòu)函數(shù)中。在對象被創(chuàng)建時,構(gòu)造函數(shù)被自動執(zhí)行;當對象消亡時,析構(gòu)函數(shù)被自動執(zhí)行。構(gòu)造函數(shù)與析構(gòu)函數(shù)的另一個特別之處是沒有返回值類型。類的 const 常量只能在初始化表里被初始化,因為它不能在函數(shù)體內(nèi)用賦值的方式來初始化??截悩?gòu)造函數(shù)和賦值函數(shù)非常容易混淆,常導致錯寫、錯用。拷貝構(gòu)造函數(shù)是在對象被創(chuàng)建時調(diào)用的,而賦值函數(shù)只能被已經(jīng)存在了的對象調(diào)用?;惖臉?gòu)造函數(shù)、析構(gòu)函數(shù)、賦值函數(shù)都不能被派生類繼承。1. 派生類的構(gòu)造函數(shù)應在
22、其初始化表里調(diào)用基類的構(gòu)造函數(shù);2. 基類和派生類的析構(gòu)函數(shù)應該為虛(加virtual 關(guān)鍵字) ;3. 在編寫派生類的賦值函數(shù)時,注意不要忘記對基類的數(shù)據(jù)成員重新賦值;使用 const 提高程序健壯性Const 不僅能定義常量,它還可以修飾函數(shù)的參數(shù)、返回值,甚至函數(shù)的定義體。Use const whenever you need.用 const 修飾函數(shù)的參數(shù):如果參數(shù)做輸出用,不論它是什么數(shù)據(jù)類型,都不能加const 修飾。Const 只能修飾輸入?yún)?shù):如果輸入?yún)?shù)采用“指針傳遞”,那么加 const 修飾可以防止意外的改動該指針,起到保護作用。如果輸入?yún)?shù)采用“值傳遞”, 由于函數(shù)將自動產(chǎn)生臨時變量用于復制該參數(shù),所以不要加con
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 父子斷離協(xié)議書
- 巴西電力購買協(xié)議書
- 泳池聘請協(xié)議書
- 屋內(nèi)家具轉(zhuǎn)讓協(xié)議書
- 班組質(zhì)量協(xié)議書
- 班組扣稅協(xié)議書
- 愛心合作協(xié)議書
- 家庭律師服務協(xié)議書
- 工地供油安全協(xié)議書
- 定點制作采購協(xié)議書
- 個人所得稅納稅籌劃研究
- 貓咪領(lǐng)養(yǎng)協(xié)議合同模板
- 高中團課考試試題及答案
- 青島2025年山東青島市即墨區(qū)部分事業(yè)單位招聘66人筆試歷年參考題庫附帶答案詳解
- Unit6RainorShine課文知識填空2024-2025學年人教版英語七年級下冊
- 開卡車的考試題及答案
- 三力老人測試題及答案
- 更換外窗施工方案
- 電動葫蘆考試試題及答案
- 四年級下冊道德與法制全冊電子教案備課
- 精神病人腸梗阻的護理
評論
0/150
提交評論