cc編程文件類別測(cè)試管理體系_第1頁(yè)
cc編程文件類別測(cè)試管理體系_第2頁(yè)
cc編程文件類別測(cè)試管理體系_第3頁(yè)
cc編程文件類別測(cè)試管理體系_第4頁(yè)
cc編程文件類別測(cè)試管理體系_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余15頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、測(cè)試系列目錄1.文件結(jié)構(gòu)11.11.21.31.4和版本的. 1頭文件的結(jié)構(gòu)1定義文件的結(jié)構(gòu)2目錄結(jié)構(gòu)32. 程序版式32.12.22.32.42.52.62.72.8空行3代碼行4代碼行內(nèi)的空格4對(duì)齊5長(zhǎng)行拆分6修飾符的位置7注釋7類的版式7命名規(guī)則8共性規(guī)則8Windows 應(yīng)用程序命名規(guī)則9Linux 應(yīng)用程序函數(shù)命名規(guī)則9表達(dá)式和基本語(yǔ)句10運(yùn)算符的優(yōu)先級(jí)10復(fù)合表達(dá)式10if 語(yǔ)句104.3.14.3.24.3.34.3.4變量與零值比較10整型變量與零值比較11浮點(diǎn)變量與零值比較11指針變量與零值比較11循環(huán)語(yǔ)句的效率11for 語(yǔ)句的循環(huán)控制變量12switch 語(yǔ)句12goto

2、 語(yǔ)句135. 常量13const 與#define 的比較13常量定義規(guī)則136. 函數(shù)設(shè)計(jì)146.16.26.36.4參數(shù)的規(guī)則14返回值的規(guī)則15函數(shù)實(shí)現(xiàn)的規(guī)則15其它建議156.5 使用斷言166.6與指針的比較16測(cè)試系列重載和內(nèi)聯(lián)16普通函數(shù)重載16內(nèi)聯(lián)函數(shù)168. 內(nèi)存管理17類的構(gòu)造函數(shù)、析構(gòu)函數(shù)、成員函數(shù)與賦值函數(shù)17類的構(gòu)造函數(shù)17成員函數(shù)17類的繼承和組合17其他規(guī)范及建議17提高程序的效率17一些有益的建議181. 文件結(jié)構(gòu)每個(gè)C+/C 程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序的(declaration),稱為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)( implemeni

3、on),稱為定義( definition)C+/C 程序的頭文件以“.h”為后綴,C 程序的定義文件以“. c”為后綴,C+程序的定義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。1.1和版本的和版本的位于頭文件和定義文件的開(kāi)頭(參見(jiàn)示例1-1),主要內(nèi)容有:(1)信息文件名稱,標(biāo)識(shí)符,摘要當(dāng)前版本號(hào),作者/修改者,完成日期版本歷史信息示例 1-1版本標(biāo)識(shí):采用 .和版本的來(lái)命名自己產(chǎn)品的。Linux還有一個(gè)約定,就是如果次版本號(hào)是偶數(shù)(如 0、2、4 等),代表正式版本,如果次版本號(hào)是奇數(shù)(如 1、3、5 等),代表的是開(kāi)發(fā)過(guò)程中的測(cè)試版本。修訂號(hào)則相當(dāng)于 B

4、uild 號(hào),用來(lái)標(biāo)識(shí)一些小的改動(dòng)。1.2 頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成:頭文件開(kāi)頭處的預(yù)處理塊。和版本(參見(jiàn)示例1-1)。第 1 頁(yè)共 18 頁(yè)/*Copyright (c) 2003,*s.*文件名稱:filename.h文件標(biāo)識(shí):見(jiàn)配置管理計(jì)劃 摘要:簡(jiǎn)要描述本文件的內(nèi)容/#ifnd f GRAPHICS/ 防止graphics h 被重復(fù)用 #defi e GRAPHICS H下面其它的碼下面是原作者、版本、完成、日期和當(dāng)前版本的息* 當(dāng)前版本:1.1.作者:輸入作者(或修改者)字* 完成日期:2003年5月 0*取代版本: . .1原作者:輸入原作者(或修者名字完成日期:200

5、3年 月10日*/3)函數(shù)和類結(jié)構(gòu)等。假設(shè)頭文件名稱為graphics.h,頭文件的結(jié)構(gòu)參見(jiàn)示例1-2?!疽?guī)則1-2-1】為了防止頭文件被重復(fù)【規(guī)則1-2-2】用#inc ude 索)?!疽?guī)則1-2-3】用#i clude “filen me.h”始搜索)。,應(yīng)當(dāng)用ifndef/define/end f 結(jié)構(gòu)產(chǎn)生預(yù)處理。格式來(lái)標(biāo)準(zhǔn)庫(kù)的頭文件(編譯器將從標(biāo)準(zhǔn)庫(kù)目錄開(kāi)始格式來(lái)非標(biāo)準(zhǔn)庫(kù)的頭文件(編譯器將從用戶的工作目錄【建議1-2-1】頭文件中只存放“”而不存放“定義”【建議1-2-2】不提倡使用全局變量,盡量不要在頭文中出現(xiàn) exter例1-2+/C 頭文件的結(jié)構(gòu)1.3 定義文件的結(jié)構(gòu)定義件有三部

6、分內(nèi)容:1)23)定義文件開(kāi)頭處的對(duì)些頭文件的和版本明(見(jiàn)示例1-1)。程序的實(shí)體(包括數(shù)據(jù)和代碼)。假設(shè)定義文件的名稱為graphics.cpp,定義-3/和版本見(jiàn)示例1-1,此處省略。 #include “ graphics.h”/頭文件/ 全局函數(shù)的實(shí)現(xiàn)體 void Function1( )./ 類成員函數(shù)的實(shí)現(xiàn)體 void Box:Draw(.)./和版本見(jiàn)示例1-1,此處省略。 #ifndef GRAPHICS_H/ 防止graphics.h 被重復(fù) #define GRAPHICS_H#include /標(biāo)準(zhǔn)庫(kù)的頭文件#include “myheader.h”/非標(biāo)準(zhǔn)庫(kù)的頭文件vo

7、id Function1( );/ 全局函數(shù)class Box/ 類結(jié)構(gòu) ;#endif示例1-3 C+/C定義文件的結(jié)構(gòu)1.4 目錄結(jié)構(gòu)如果一個(gè)目錄,以便于的頭文件數(shù)目比較多(如超過(guò)十個(gè)),通常應(yīng)將頭文件和定義文件分別保存于不同的。例如可將頭文件保存于include 目錄,將定義文件保存于source 目錄(可以是多級(jí)目錄)。如果某些頭文件是私有的,它不會(huì)被用戶的程序直接,則沒(méi)有必要公開(kāi)其“”。為了加強(qiáng)信息隱藏,這些私有的頭文件可以和定義文件存放于同一個(gè)目錄。程序版式空行空行起著分隔程序段落的作用??招械皿w(不過(guò)多也不過(guò)少)將使程序的布局更加清晰。空行不會(huì)浪費(fèi)內(nèi)存,所以不要舍不得用空行?!疽?guī)

8、則2-1-1】在每個(gè)類之后、每個(gè)函數(shù)定義結(jié)束之后都要加空行。參見(jiàn)示例2-1(a)【規(guī)則2-1-2】在一個(gè)函數(shù)體內(nèi),邏輯上密切相關(guān)的語(yǔ)句之間不加空行,其它地方應(yīng)加空行分隔。參見(jiàn)示例2-1(b)示例2-1(a) 函數(shù)之間的空行示例2-1(b) 函數(shù)的空行第 3 頁(yè)共 18 頁(yè)/ 空行void Function1(.)./ 空行void Function2(.)./ 空行void Function3(.)./ 空行while (condition)sement1;/ 空行if (condition)sement2;elsesement3;/ 空行sement4;2.2 代碼行【規(guī)則2-2-1】一行代

9、碼只做一件事情,如只定義一個(gè)變量,或只寫一條語(yǔ)句。這樣的代碼容易閱讀,并且方便于寫注釋?!疽?guī)則2-2-2】if、for、while、do 等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不論執(zhí)行語(yǔ)句有多少都要加。這樣可以防止書(shū)寫?!窘ㄗh2-2-1】盡可能在定義變量的同時(shí)初始化該變量(就近原則)如果變量的處和其定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如果了未被初始化的變量,可能會(huì)導(dǎo)致程序錯(cuò)誤。本建議可以減少隱患。例如width = 10;height = 10;/定義并初紿化width定義并初紿化height定義并初紿化depthdepth=10;示例2-2(a) 風(fēng)格良好的代碼行示例2-2(b) 風(fēng)

10、格不良的代碼行2.3 代碼行內(nèi)的空格【規(guī)則2-3-1】關(guān)鍵字之后要留空格。象const、virtual、inline、case 等關(guān)鍵字之后至少要留一個(gè)空格,否則無(wú)法辨析關(guān)鍵字。象if、for、while 等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)(,出關(guān)鍵字?!疽?guī)則2-3-2】函數(shù)名之后不要留空格,緊跟左括號(hào)(,以與關(guān)鍵字區(qū)別。【規(guī)則2-3-3】(向后緊跟,)、,、;向前緊跟,緊跟處不留空格?!疽?guī)則2-3-4】,之后要留空格,如Function(x, y, z)。如果;不是一行的結(jié)束符號(hào),其后要留空格,如for (initialization; condition; update)。第 4 頁(yè)共 1

11、8 頁(yè)width; / 寬度 height; / 高度 depth; / 深度width, height, depth; / 寬度高度深度x = a + b; y = c + d; z = e + f;X a + b; y = c + d; z = e + f;if (width height)dosomething();if (width =”、“=”、“+”、“*”、“% ”、“& ”、“ |”、“”這類操作符前后不加空格?!窘ㄗh2-3-1】對(duì)于表達(dá)式比較長(zhǎng)的for 語(yǔ)句和if語(yǔ)句,為了緊湊起見(jiàn)可以適當(dāng)?shù)厝サ粢恍┛崭?,如for(i=0;i10;i+)和if(a=b)&(c= 2000) /

12、 良好的風(fēng)格if(year=2000)/ 不良的風(fēng)格 if (a=b) & (c=b&c=d)/ 不良的風(fēng)格for (i=0; I10; i+) / 良好的風(fēng)格 for(i=0;i10;i+)/ 不良的風(fēng)格 for (i = 0; I 10; i +) / 過(guò)多的空格x = a b ? a : b;/ 良好的風(fēng)格x=aFunction();/ 不要寫成 b - Function();示例2-4(a) 風(fēng)格良好的對(duì)齊示例2-4(b) 風(fēng)格不良的對(duì)齊2.5 長(zhǎng)行拆分【規(guī)則2-5-1】代碼行最大長(zhǎng)度宜控制在70 至80 個(gè)字符以內(nèi)。代碼行不要過(guò)長(zhǎng),否則看不過(guò)來(lái),也不便于打印?!疽?guī)則2-5-2】長(zhǎng)表達(dá)

13、式要在低優(yōu)先級(jí)操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。示例2-5 長(zhǎng)行的拆分第 6 頁(yè)共 18 頁(yè)if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14) & (very_longer_variable5 Draw(); / 類的成員函數(shù)【規(guī)則3-1-8】用正確的反義詞組命名具有互斥意義的變量或相作的函數(shù)等。例如:minValue; maxValue; SetValue( ); G

14、etValue( );【建議3-1-1】盡量避免名字中出現(xiàn)數(shù)字,如Value1,Value2等,除非邏輯上的確需要。3.2 Windows 應(yīng)用程序命名規(guī)則【規(guī)則3-2-1】類名和函數(shù)名用大寫字母開(kāi)頭的單詞組合而成。例如:claode;class LeafNode; void Draw(void); void SetValue(/類名 類名 函數(shù)名value); / 函數(shù)名【規(guī)則3-2-2】變量和參數(shù)用小寫字母開(kāi)頭的單詞組合而成。例如:BOOL flag;drawMode;【規(guī)則3-2-3】常量全用大寫的字母,用下劃線分割單詞。例如:constconstMAX = 100;MAX_LENGTH

15、 = 100;【規(guī)則3-2-4】靜態(tài)變量加前綴s_(表示sic)。例如:void Init()sics_initValue; / 靜態(tài)變量【規(guī)則3-2-5】如果需要定義全局變量,則使全局變量加前綴g_(表示global)。例如:g_howManyPeople; / 全局變量g_howMuoney; / 全局變量【規(guī)則3-2-6】類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名。例如:void Object:SetValue(m_width = width; m_height = height;width,height)【規(guī)則3-2-7】為了防止某一庫(kù)中的一些

16、標(biāo)識(shí)符和其它庫(kù)中的,可以為各種標(biāo)識(shí)符加上能反映性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL 的所有庫(kù)函數(shù)均以gl 開(kāi)頭,所有常量(或宏定義)均以GL 開(kāi)頭。3.3 Linux 應(yīng)用程序函數(shù)命名規(guī)則函數(shù)命名應(yīng)遵循下面兩個(gè)原則:1)屬于某一模塊的函數(shù),加上前綴,前綴為模塊縮寫;第 9 頁(yè)共 18 頁(yè)2)函數(shù)名應(yīng)該表明函數(shù)意義,格式為前綴_名詞_動(dòng)詞;表達(dá)式和基本語(yǔ)句運(yùn)算符的優(yōu)先級(jí)【規(guī)則4-1-1】如果代碼行中的運(yùn)算符比較多,用括號(hào)確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級(jí)。為了防止產(chǎn)生歧義并提高可讀性,應(yīng)當(dāng)用括號(hào)確定表達(dá)式的操作順序。例如:word = (high = b & c d & c + f

17、= g + h ;/ 復(fù)合表達(dá)式過(guò)于復(fù)雜【規(guī)則4-2-2】不要有多用途的復(fù)合表達(dá)式。例如:d = (a = b + c) + r ;該表達(dá)式既求a 值又求d 值。應(yīng)該拆分為兩個(gè)獨(dú)立的語(yǔ)句:a = b + c;d = a + r;【規(guī)則4-2-3】程序中的復(fù)合表達(dá)式與“真正的數(shù)學(xué)表達(dá)式”。例如:if (a b c)并不表示 if (ab)而是成了令人費(fèi)解的/ a b c 是數(shù)學(xué)表達(dá)式而不是程序表達(dá)式 & (bc)if ( (ab)=”或“=-EPSINON) & (x=EPSINON)其中EPSINON 是允許的誤差(即精度)。4.3.4 指針變量與零值比較【規(guī)則4-3-4】應(yīng)當(dāng)將指針變量用“=

18、”或“!=”與NULL 比較。指針變量的零值是“空”(記為NULL)。盡管NULL 的值與0 相同,但是兩者意義不同。假設(shè)指針變量的名字為p,它與零值比較的標(biāo)準(zhǔn)if 語(yǔ)句如下:if (p = if (p !=不要寫成NULL)/ p 與NULL 顯式比較,強(qiáng)調(diào)p 是指針變量 NULL)if if或者if if(p = (p !=0)/ 容易讓人誤解p 是整型變量 0)(p) (!p)/ 容易讓人誤解p 是變量4.4 循環(huán)語(yǔ)句的效率C+/C 循環(huán)語(yǔ)句中,for 語(yǔ)句使用頻率最高,while 語(yǔ)句其次,do 語(yǔ)句很少用。本節(jié)重點(diǎn)論述循環(huán)體的效率。提高循環(huán)體效率的基本辦法是降低循環(huán)體的復(fù)雜性?!窘ㄗh

19、4-4-1】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU 跨切循環(huán)層的次數(shù)。例如示例4-4(b)的效率比示例4-4(a)的高。第 11 頁(yè)共 18 頁(yè)示例4-4(a) 低效率:長(zhǎng)循環(huán)在最外層示例4-4(b) 高效率:長(zhǎng)循環(huán)在最內(nèi)層【建議4-4-2】如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,邏輯判斷移到循環(huán)體的外面。示例4-4(c)的程序比示例4-4(d)多執(zhí)行了N-1 次邏輯判斷。并且由于前者總要進(jìn)行邏輯判斷,打斷了循環(huán) “流水線”作業(yè),使得編譯器不能對(duì)循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果N 非常大,最好采用示例4-4(d)的寫法,可以提高效率。如果

20、N 非常小,兩者效率差別并不明顯,采用示例4-4(c)的寫法比較好,因?yàn)槌绦蚋雍?jiǎn)潔。表4-4(c) 效率低但程序簡(jiǎn)潔表4-4(d) 效率高但程序不簡(jiǎn)潔4.5 for 語(yǔ)句的循環(huán)控制變量【規(guī)則4-5-1】不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止for 循環(huán)失去控制。【建議4-5-1】建議for 語(yǔ)句的循環(huán)控制變量的取值采用“半開(kāi)半閉區(qū)間”寫法。示例4-5(a)中的x 值屬于半開(kāi)半閉區(qū)間“0 = x N”,起點(diǎn)到終點(diǎn)的間隔為N,循環(huán)次數(shù)為N。示例4-5(b)中的x 值屬于閉區(qū)間“0 = x = N-1”,起點(diǎn)到終點(diǎn)的間隔為N-1,循環(huán)次數(shù)為N。相比之下,示例4-5(a)的寫法更加直觀,盡管兩者的

21、功能是相同的。示例4-5(a) 循環(huán)變量屬于半開(kāi)半閉區(qū)間示例4-5(b) 循環(huán)變量屬于閉區(qū)間4.6 switch 語(yǔ)句【規(guī)則4-6-1】每個(gè)case 語(yǔ)句的結(jié)尾了加break,否則將導(dǎo)致多個(gè)分支(除非有意使多個(gè)分支)。第 12 頁(yè)共 18 頁(yè)for (x=0; xN; x+).for (x=0; x=N-1; x+).for (i=0; iN; i+)if (condition) DoSomething();elseDoOtherthing();if (condition)for (i=0; iN; i+) DoSomething();elsefor (i=0; iN; i+) DoOther

22、thing();for (row=0; row100; row+)for ( col=0; col5; col+ )sum = sum + arowcol;for (col=0; col5; col+ )for (row=0; row100; row+)sum = sum + arowcol;【規(guī)則4-6-2】default : break;記最后那個(gè)default 分支。即使程序真的不需要default 處理,也應(yīng)該保留語(yǔ)句4.7 goto 語(yǔ)句自從提倡結(jié)構(gòu)化設(shè)計(jì)以來(lái),goto 就成了有爭(zhēng)議的語(yǔ)句。首先,由于goto 語(yǔ)句可以靈活跳轉(zhuǎn),如果不加限制,它的確會(huì)破壞結(jié)構(gòu)化設(shè)計(jì)風(fēng)格。其次,goto

23、 語(yǔ)句經(jīng)常帶來(lái)錯(cuò)誤或隱患。它可能跳過(guò)了某些對(duì)象的構(gòu)造、變量的初始化、重要的計(jì)算等語(yǔ)句,例如:goto se;String s1, s2;/ 被goto 跳過(guò) sum = 0; / 被goto 跳過(guò).se:.如果編譯器不能發(fā)覺(jué)此類錯(cuò)誤,每用一次goto 語(yǔ)句都可能留下隱患。很多人建議C+/C 的goto 語(yǔ)句,以絕后患。但實(shí)事求是地說(shuō),錯(cuò)誤是程序員自己造成的,不是goto 的過(guò)錯(cuò)。goto 語(yǔ)句至少有一處可顯神通,它能從多重循環(huán)體中咻地一下子跳到外面,用不著寫很多次的break 語(yǔ)句。就象樓房著火了,來(lái)不及從樓梯一級(jí)一級(jí)往下走,可從窗口跳出火坑。所以、慎用goto 語(yǔ)句,而不是完全禁用。主常量常

24、量是一種標(biāo)識(shí)符,它的值在運(yùn)行期間恒定不變。C 語(yǔ)言用#define 來(lái)定義常量(稱為宏常量)。 C+ 語(yǔ)言除了#define 外還可以用const 來(lái)定義常量(稱為const 常量)。const 與#define 的比較C+ 語(yǔ)言可以用const 來(lái)定義常量,也可以用#define 來(lái)定義常量。但是前者比后者有的優(yōu)點(diǎn):const 常量有數(shù)據(jù)類型,而宏常量沒(méi)有數(shù)據(jù)類型。編譯器可以對(duì)前者進(jìn)行類型安全檢查。而對(duì)后者只進(jìn)行字符替換,沒(méi)有類型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤(邊際效應(yīng))。有些集成化的調(diào)試工具可以對(duì)const 常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試?!疽?guī)則5-1-1】盡量使

25、用含義直觀的常量來(lái)表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串。例如:#define MAX 100/* C 語(yǔ)言的宏常量*/constMAX = 100;/ C+ 語(yǔ)言的const 常量const float PI = 3.14159; / C+ 語(yǔ)言的const 常量【規(guī)則5-1-2】在C+ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。5.2 常量定義規(guī)則【規(guī)則5-2-1】需要對(duì)外公開(kāi)的常量放在頭文件中,不需要對(duì)外公開(kāi)的常量放在定義文件的頭部。為便于管理,可以把不同模塊的常量集中存放在一個(gè)公共的頭文件中?!疽?guī)則5-2-2】如果某一常量與其它常量密切相關(guān),應(yīng)在定

26、義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。例如:const float RADIUS = 100;const float DIAMETER = RADIUS * 2;第 13 頁(yè) 共 18 頁(yè)6. 函數(shù)設(shè)計(jì)一個(gè)函數(shù)的注釋信息如下例:/*Function: parameter:outout:calculateThe area of rectangle*the Lengnd Width of rectanglethe area ofrectangle*/GetValue(iLength,iWidth) . returniArea;/*Error:1 描述在單元測(cè)試中出現(xiàn)的錯(cuò)誤2 .*/6.1 參數(shù)

27、的規(guī)則【規(guī)則6-1-1】參數(shù)的書(shū)寫要完整,不要?jiǎng)t用void 填充。省事只寫參數(shù)的類型而省略參數(shù)名字。如果函數(shù)沒(méi)有參數(shù),例如:void SetValue(void SetValue(width,height);/ 良好的風(fēng)格/ 不良的風(fēng)格/ 良好的風(fēng)格/ 不良的風(fēng)格,);float GetValue(void); float GetValue();【規(guī)則6-1-2】參數(shù)命名要恰當(dāng),順序要合理。例如:編寫字符串拷貝函數(shù)StringCopy,它有兩個(gè)參數(shù)。如果把參數(shù)名字起為str1 和str2,例如 void StringCopy(char *str1, char *str2);那么很難搞清楚究竟是

28、把str1 拷貝到str2 中,還是剛好倒過(guò)來(lái)??梢园褏?shù)名字起得更有意義,如叫strSource 和strDestination。這樣從名字上就可以看出應(yīng)該把strSource 拷貝到strDestination。另外,這兩個(gè)參數(shù)那一個(gè)該那一個(gè)該在后?參數(shù)的順序要遵循程序員的。一般地,應(yīng)將目的參數(shù)放面,源參數(shù)放在后面。【規(guī)則6-1-3】如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。例如:void StringCopy(char *strDestination,const char *strSource);【規(guī)則6-1-4】如果輸入?yún)?shù)以值傳遞的方式

29、傳遞對(duì)象,則宜改用“const & ”方式來(lái)傳遞,這樣可以省去臨時(shí)對(duì)象的構(gòu)造和析構(gòu)過(guò)程,從而提高效率?!疽?guī)則 6-1-5】參數(shù)缺省值只能出現(xiàn)在函數(shù)的中,而不能出現(xiàn)在定義體中?!疽?guī)則 6-1-6】如果函數(shù)有多個(gè)參數(shù),參數(shù)只能從后向前挨個(gè)兒缺省,否則將導(dǎo)致函數(shù)調(diào)用語(yǔ)句怪模怪樣?!窘ㄗh6-1-1】避免函數(shù)有太多的參數(shù),參數(shù)個(gè)數(shù)盡量控制在5 個(gè)以內(nèi)。如果參數(shù)太多,在使用時(shí)容易將參數(shù)類型或順序搞錯(cuò)?!窘ㄗh6-1-2】盡量不要使用類型和數(shù)目不確定的參數(shù)。第 14 頁(yè)共 18 頁(yè)6.2 返回值的規(guī)則【規(guī)則6-2-1】不要省略返回值的類型。C+語(yǔ)言有很嚴(yán)格的類型安全檢查,不允許上述情況發(fā)生。由于C+ 程序可以

30、調(diào)用C 函數(shù),為了避免,規(guī)定任何C+/ C 函數(shù)都必須有類型。如果函數(shù)沒(méi)有返回值,那么應(yīng)為void 類型?!疽?guī)則6-2-2】函數(shù)名字與返回值類型在語(yǔ)義上不可?!疽?guī)則6-2-3】不要將正常值和錯(cuò)誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯(cuò)誤標(biāo)志用return 語(yǔ)句返回?!疽?guī)則 6-2-4】給以“指針傳遞”方式的函數(shù)返回值加 const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加 const 修飾的同類型指針。【規(guī)則 6-2-5】函數(shù)返回值采用“值傳遞方式”,由于函數(shù)會(huì)把返回值加 const 修飾沒(méi)有任何價(jià)值。到外部臨時(shí)的單元中,【規(guī)則 6-2-6】函數(shù)返回值采用“目的

31、是為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)。傳遞”的場(chǎng)合并不多,這種方式一般只出現(xiàn)在類的賦值函數(shù)中,6.3 函數(shù)實(shí)現(xiàn)的規(guī)則不同功能的函數(shù)其實(shí)現(xiàn)各不相同,看起來(lái)似乎無(wú)法就“實(shí)現(xiàn)”達(dá)成一致的觀點(diǎn)。但根據(jù)經(jīng)驗(yàn),可以在函數(shù)體的“處”和“出口處”從嚴(yán)把關(guān),從而提高函數(shù)的質(zhì)量。處”,對(duì)參數(shù)的有效性進(jìn)行檢查。【規(guī)則6-3-1】在函數(shù)體的“【規(guī)則6-3-2】在函數(shù)體的“出口處”,對(duì)return 語(yǔ)句的正確性和效率進(jìn)行檢查。注意事項(xiàng)如下:(1)return 語(yǔ)句不可返回指向“棧內(nèi)存”的“指針”或者“動(dòng)銷毀。例如char * Func(void)”,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自char str = “return str;o world

32、”; / str 的內(nèi)存位于棧上/ 將導(dǎo)致錯(cuò)誤(2)要搞清楚返回的究竟是“值”、“指針”還是“”。(3)如果函數(shù)返回值是一個(gè)對(duì)象,要考慮return 語(yǔ)句的效率。6.4 其它建議【建議6-4-1】函數(shù)的功能要單一,不要設(shè)計(jì)多用途的函數(shù)?!窘ㄗh6-4-2】函數(shù)體的規(guī)模要小,盡量控制在50 行代碼之內(nèi)?!窘ㄗh6-4-3】盡量避免函數(shù)帶有“”功能。相同的輸入應(yīng)當(dāng)產(chǎn)生相同的輸出。帶有“”功能的函數(shù),其行為可能是不可的,因?yàn)樗男袨榭赡苋Q于某種“狀態(tài)”。這樣的函數(shù)既不易理解又不利于測(cè)試和。在C/C+語(yǔ)言中,函數(shù)的sic 局部變量是函數(shù)的“”器。建議盡量少用sic 局部變量,除非必需?!窘ㄗh6-4-4】

33、不僅要檢查輸入?yún)?shù)的有效性,還要檢查通過(guò)其它途徑進(jìn)入函數(shù)體內(nèi)的變量的有效性,例如全局變量、文件句柄等?!窘ㄗh6-4-5】用于出錯(cuò)處理的返回值一定要清楚,讓使用者不容易忽視或誤解錯(cuò)誤情況。第 15 頁(yè)共 18 頁(yè)6.5 使用斷言程序一般分為Debug 版本和Release 版本,Debug 版本用于使用。調(diào)試,Release 版本給用戶斷言assert 是僅在Debug 版本起作用的宏,它用于檢查“不應(yīng)該”發(fā)生的情況。在運(yùn)行過(guò)程中,如果assert 的參數(shù)為假,那么程序就會(huì)中止(一般地還會(huì)出現(xiàn)提示,說(shuō)明在什么地方了assert)。assert 不是一個(gè)倉(cāng)促拼湊起來(lái)的宏。為了不在程序的Debug

34、版本和Release 版本引起差別,assert不應(yīng)該產(chǎn)生任何副作用。所以assert 不是函數(shù),而是宏。程序員可以把a(bǔ)ssert 看成一個(gè)在任何系統(tǒng)狀態(tài)下都可以安全使用的無(wú)害測(cè)試。如果程序在assert處終止了,并不是說(shuō)含有該assert 的函數(shù)有錯(cuò)誤,而是調(diào)用者出了差錯(cuò),assert 可以幫助找到發(fā)生錯(cuò)誤的原因?!疽?guī)則6-5-1】使用斷言捕捉不應(yīng)該發(fā)生的是必然存在的并且是一定要作出處理的。情況。不要情況與錯(cuò)誤情況之間的區(qū)別,后者【規(guī)則6-5-2】在函數(shù)的處,使用斷言檢查參數(shù)的有效性()?!窘ㄗh6-5-1】在編寫函數(shù)時(shí),要進(jìn)行反復(fù)的考查,并且自問(wèn):“我打算做哪些假定?”一旦確定了的假定,就要

35、使用斷言對(duì)假定進(jìn)行檢查?!窘ㄗh6-5-2】一般教科書(shū)都鼓勵(lì)程序員們進(jìn)行防錯(cuò)設(shè)計(jì),但要記住這種編程風(fēng)格可能會(huì)隱瞞錯(cuò)誤。當(dāng)進(jìn)行防錯(cuò)設(shè)計(jì)時(shí),如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進(jìn)行。6.與指針的比是C+中的概念,容易把的一些規(guī)則如下和指針(1)被創(chuàng)建的同時(shí)必須被初始化(指針則可以在任何時(shí)候被初始化)(2)不能有NUL,必須與合法的單元關(guān)聯(lián)(指針則可以是NULL)(3)一旦被初始化,就不能改變的關(guān)系(指針則可以隨時(shí)改變所指的對(duì)象)重載和內(nèi)7.1 普通函數(shù)重【規(guī)則 7-1-1】重載函數(shù)中的參數(shù)不同(包括類型、順序不同),才是重載函數(shù),而僅僅返回值不同則【規(guī)則 7-1-2】當(dāng)心隱式類型轉(zhuǎn)換導(dǎo)致

36、重載函數(shù)產(chǎn)生二義性,數(shù)字本身沒(méi)有類型,將數(shù)字當(dāng)作參數(shù)時(shí)將自動(dòng)進(jìn)行類型轉(zhuǎn)換(稱為隱式類型轉(zhuǎn)換)成員函數(shù)的重載、覆蓋與隱【規(guī)則 7-2-1】成員函數(shù)的重載、覆蓋(override)與隱藏很容易,注意區(qū)分【規(guī)則 7-2-2】注意如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú) virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載)【規(guī)則 7-2-3】注意如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒(méi)有virtual 關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋7.2 內(nèi)聯(lián)函)【規(guī)則 7-3-1】盡量用內(nèi)聯(lián)取代宏代碼,提高函數(shù)的執(zhí)行效率(速度)【規(guī)則 7-3-2】關(guān)鍵

37、字 inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將 inline 放在函數(shù)前面不起任何作用【規(guī)則 7-3-3】如果函數(shù)體內(nèi)的代碼比較長(zhǎng)或函數(shù)體內(nèi)出現(xiàn)循環(huán),則不宜使用內(nèi)聯(lián)第 16 頁(yè)共 18 頁(yè)8. 內(nèi)存管理內(nèi)存分配方式有三種:(1) 從靜態(tài)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,sic 變量。(2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些單元自動(dòng)被限。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有(3) 從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用mall

38、oc 或new 申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free 或delete題也最多。內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由決定,使用非常靈活,但問(wèn)【規(guī)則8-1-1】用malloc 或new 申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存?!疽?guī)則8-1-2】記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用。【規(guī)則8-1-3】避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”操作。【規(guī)則8-1-4】動(dòng)態(tài)內(nèi)存的申請(qǐng)與必須配對(duì),防止內(nèi)存泄漏?!疽?guī)則8-1-5】用free 或delete了內(nèi)存之后,立即將指針設(shè)置為NULL,防止產(chǎn)生“野指針”。類的構(gòu)造函數(shù)、析構(gòu)函數(shù)、成員函數(shù)與賦值函數(shù)類的構(gòu)造函數(shù)【規(guī)則 9-1-1】“缺省的拷貝構(gòu)造函數(shù)”和“缺省的賦值函數(shù)”均采用“位拷貝”而非“值拷貝”的方式來(lái)實(shí)現(xiàn),若類中含有指針變量,不能采用缺省的方式?!疽?guī)則 9-1-2】如果類存在繼承關(guān)系,派生類必須在其初始化表里調(diào)用基類的構(gòu)造函數(shù)?!疽?guī)則 9-1-3】類的const 常量只能在初始化表里被初始化,因?yàn)樗荒茉诤瘮?shù)體內(nèi)用賦值的方式來(lái)初始化?!疽?guī)則 9-1-4】非數(shù)據(jù)類型的成員對(duì)象采

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論