開發(fā)管理之代碼編碼規(guī)范_第1頁
開發(fā)管理之代碼編碼規(guī)范_第2頁
開發(fā)管理之代碼編碼規(guī)范_第3頁
開發(fā)管理之代碼編碼規(guī)范_第4頁
開發(fā)管理之代碼編碼規(guī)范_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

開發(fā)管理之代碼編碼規(guī)范開發(fā)管理之代碼編碼規(guī)范開發(fā)管理之代碼編碼規(guī)范xxx公司開發(fā)管理之代碼編碼規(guī)范文件編號:文件日期:修訂次數(shù):第1.0次更改批準審核制定方案設計,管理制度程序版式對齊程序塊要采用縮進風格編寫,縮進的空格數(shù)為4個。使用VC提供的Tab鍵對齊?!皗”和“}”應獨占一行并且位于同一列,同時引用他們的語句對齊{}之內的代碼塊在“{”右邊數(shù)格外左對齊例:正確 錯誤voidFunction(intx){…,“;”,“)”向前緊跟“,”后要留空格,“”;之后如果不是一行的結束,后面要留空格賦值操作符,比較,算術,邏輯,第二元操作符前后加空格一元操作符!、~、++、--、—等前后不加空格像[]、“.”、—>等前后不加空格例:voidFunc1(intx,inty,intz);Function();b->Function();從左至右!~++--(類型)sizeof+-*&從右至左*/%從左至右+-從左至右<<>>從左至右<<=>>=從左至右==!=從左至右&從左至右^從左至右|從左至右&&從左至右||從右至左:從右至左=+=-=*=/=%=&=^=|=<<=>>=從左至右if語句布爾變量與零值比較時,不可將布爾變量直接與TRUE、FALSE或者1、0進行比較 假設布爾變量名字為flag,它與零值比較的標準if語句如下:if(flag) 中,不需要對外公開的常量放在定義文件(*.cpp)的頭部不能在類中初始化const常量,只能通過枚舉常量來解決 例: 錯誤:classA { constintSIZE=100;(錯誤) intarray[SIZE]; } 正確:classA {… enum{SIZE1=100,SIZE2=200};//枚舉常量 intarray1[SIZE1]; intarray2[SIZE2]; };函數(shù)參數(shù)規(guī)則參數(shù)書寫要完整,不能只寫類型,不寫參數(shù)名,如果函數(shù)沒有參數(shù),用void填充例如:voidSetValue(intwidth,intheight); //良好的風格voidSetValue(int,int); //不良的風格floatGetValue(void); //良好的風格floatGetValue(); //不良的風格 如果參數(shù)是指針,且僅作輸入用,則應在類型前加const,以免指針在函數(shù)體內被意外修改;一般地,應將目的參數(shù)放在前面,源參數(shù)放在后面 例: voidStrngCopy(char*strlDestintion,consthar*StrSource)如果參數(shù)以值傳遞的方式傳遞對象,則宜改用“const&”方法傳遞,能提高效率避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)應盡量控制在5個以內盡量不要使用類型和數(shù)目不確定的參數(shù)例: intprintf(constcha*format[,argument]…); 對于內置類型參數(shù)要傳值 需要傳指針不傳引用的情形 a)內部需要用NULL狀態(tài)(引用沒有NULL狀態(tài)) b)若參數(shù)是被new出來的,是將在函數(shù)內被釋放返回值規(guī)則函數(shù)的輸出值結果用輸出參數(shù)(一般為指針)獲得,狀態(tài)用return返回如果返回一個對象,一般用引用傳遞,但有的情況下必須用值傳遞例如:classString{… //賦值函數(shù) String&operate=(constString&other); //相加函數(shù),如果沒有friend修飾則只許有一個右側參數(shù)friend Stringoperate+(constString&s1,constString&s2);private: char*m_data;} String的賦值函數(shù)operate=的實現(xiàn)如下:String&String::operate=(constString&other){ if(this==&other){return*this;} deletem_data; m_data=newchar[strlen+1]; strcpy(m_data,; return*this; //返回的是*this的引用,無需拷貝過程}對于賦值函數(shù),應當用“引用傳遞”的方式返回String對象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return語句要把*this拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。例如: Stringa,b,c; … a=b; //如果用“值傳遞”,將產(chǎn)生一次*this拷貝 a=b=c; //如果用“值傳遞”,將產(chǎn)生兩次*this拷貝 String的相加函數(shù)operate+的實現(xiàn)如下:Stringoperate+(constString&s1,constString&s2){ Stringtemp; delete; //是僅含‘\0’的字符串 =newchar[strlen+strlen+1]; strcpy,; strcat,; returntemp; }對于相加函數(shù),應當用“值傳遞”的方式返回String對象。如果改用“引用傳遞”,那么函數(shù)返回值是一個指向局部對象temp的“引用”。由于temp在函數(shù)結束時被自動銷毀,將導致返回的“引用”無效。例如: c=a+b;此時a+b并不返回期望值,c什么也得不到,流下了隱患。盡量保持函數(shù)只有唯一出口若函數(shù)返回狀態(tài),嘗試用枚舉作類型 當函數(shù)返回引用或指針時,用文字描述其有效性禁止成員函數(shù)返回成員的引用或指針函數(shù)內部規(guī)則在函數(shù)體的“入口處”,對參數(shù)的有效性進行檢查,應正確使用斷言(assert),斷言assert是僅在Debug版本起作用的宏,它用于檢查“不應該”發(fā)生的情況 例: void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){ assert((pvTo!=NULL)&&(pvFrom!=NULL)); //使用斷言 byte*pbTo=(byte*)pvTo; //防止改變pvTo的地址 byte*pbFrom=(byte*)pvFrom; //防止改變pvFrom的地址 while(size-->0) *pbTo++=*pbFrom++; returnpvTo; }在函數(shù)的“出口處”,應對return語句的正確性和效率進行檢查return語句不可返回指向“找內存”(內部變量)的指針或引用,因為該內存在函數(shù)體結束時被自動銷毀 要搞清楚返回的究竟是值、指針,還是引用如果函數(shù)返回值是一個對象,要考慮return語句的效率通用規(guī)則函數(shù)的功能要單一,不要設計多用途函數(shù)函數(shù)體規(guī)模要小,盡量控制在100行代碼以內,不包括注釋和空格行盡量避免函數(shù)帶有記憶功能,相同的輸入應當產(chǎn)生相同的輸出(不用static變量)示例:如下函數(shù),其返回值(即功能)是不可預測的。unsignedintinteger_sum(unsignedintbase){unsignedintindex;staticunsignedintsum=0;//注意,是static類型的。//若改為auto類型,則函數(shù)即變?yōu)榭深A測。for(index=1;index<=base;index++){sum+=index;}returnsum;}用于出錯處理的返回值一定要清楚引用的規(guī)則a)引用被創(chuàng)建時同時被初始化b)不能有NULL引用,引用必須與合法的存儲單元關聯(lián)c)一旦引用被初始化,就不能改變引用的關系d)引用的功能主要是傳遞參數(shù)和返回值C++語言中,函數(shù)的參數(shù)和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。 以下是“值傳遞”的示例程序。由于Func1函數(shù)體內的x是外部變量n的一份拷貝,改變x的值不會影響n,所以n的值仍然是0。 voidFunc1(intx){ x=x+10;}…intn=0; Func1(n); cout<<“n=”<<n<<endl; //n=0 以下是“指針傳遞”的示例程序。由于Func2函數(shù)體內的x是指向外部變量n的指針,改變該指針的內容將導致n的值改變,所以n的值成為10。 voidFunc2(int*x){ (*x)=(*x)+10;}…intn=0; Func2(&n); cout<<“n=”<<n<<endl; //n=10 以下是“引用傳遞”的示例程序。由于Func3函數(shù)體內的x是外部變量n的引用,x和n是同一個東西,改變x等于改變n,所以n的值成為10。 voidFunc3(int&x){ x=x+10;}…intn=0; Func3(n); cout<<“n=”<<n<<endl; //n=10 對比上述三個示例程序,會發(fā)現(xiàn)“引用傳遞”的性質象“指針傳遞”,而書寫方式象“值傳遞”。實際上“引用”可以做的任何事情“指針”也都能夠做,為什么還要“引用”這東西答案是“用適當?shù)墓ぞ咦銮∪缙浞值墓ぷ鳌薄?指針能夠毫無約束地操作內存中的如何東西,盡管指針功能強大,但是非常危險。就象一把刀,它可以用來砍樹、裁紙、修指甲、理發(fā)等等,誰敢這樣用如果的確只需要借用一下某個對象的“別名”,那么就用“引用”,而不要用“指針”,以免發(fā)生意外。比如說,某人需要一份證明,本來在文件上蓋上公章的印子就行了,如果把取公章的鑰匙交給他,那么他就獲得了不該有的權利。內存管理內存分配方式有三種分配方式靜態(tài)存儲區(qū)分配,內存在編譯的時候已經(jīng)分配好,這塊內存在整個運行期間都存在,例如全局變量,static變量在棧上創(chuàng)建,執(zhí)行函數(shù)時,函數(shù)內部局部變量都在棧上創(chuàng)建,函數(shù)執(zhí)行結束時,這些存儲變量自動被釋放從堆上分配,亦稱動態(tài)內存分配,程序運行時用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存常見的內存錯誤內存分配未成功,卻使用了它。對于函數(shù)參數(shù),用asset(p!=NULL)檢查,如果是malloc或new來申請內存,應用if(p==NULL)或if(!p==NULL)來處理內存分配雖然成功,但是尚未初始化就引用它,內存的默認值并不一定為空內存分配成功,也初始化了,但越界了忘記了釋放內存,造成內存泄漏釋放了內存卻繼續(xù)使用它規(guī)則用malloc或new申請內存后,應立即檢查指會值是否為NULL,防止使用指針值為NULL的內存不要忘記為數(shù)組和動脈內存賦值,防止將未被初始化的內存作為右值使用防止數(shù)組或指針的下標越界動態(tài)內存的申請與釋放必須配對,防止內存泄漏用free或delete釋放內存之后,立即將指針設置為NULL,防止產(chǎn)生“野指針”野指針的三種來源:指針變量被創(chuàng)建時沒有初化指針被free或delete后沒有被賦NULL指針不在有效期用new創(chuàng)建動態(tài)數(shù)組,必須用delete[],如:obj*objects=newobj[100];delete[]objects;用new,delete代替malloc、calloc和freeMFC控件的命名規(guī)則CButton m_btnValueCComboBox m_cmboValue;CDialog CDlgServerstatus;CDateTimeCtrl m_dtcValue;CEdit m_editValue;CListBox m_lsbValue;CListCtrl m_lscValue;COleDateTime m_dtValue;CProgressCtrl m_prgValue;CRichEditCtrl m_reditValue;CS

溫馨提示

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

評論

0/150

提交評論