




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C++編碼規(guī)范與指導(dǎo)
版本:1.27
推薦瀏覽設(shè)置:
?屏幕分辨率:N1024x768
?字體:中(Ctrl+鼠標(biāo)滾輪設(shè)置)
?最大化本窗口
文檔控制
版本號(hào)修改時(shí)間修改內(nèi)容修改人審稿人
1.02004-07-22?創(chuàng)建白楊田振軍
1.12004-08-05?根據(jù)審稿意見修改白楊田振軍、
馬浩軍、
葉曉峰
1.22004-08-09?根據(jù)審稿意見修改白楊田振軍、
馬浩軍、
.新增、虛函數(shù)和虛
RTTI葉曉峰
基類的開銷分析及使用
指導(dǎo)
1.32004-08-10?重寫目錄;一些小改動(dòng)白楊
1.42004-08-10.新增C++成長篇:-)白楊廣大
CSDN±
的網(wǎng)友,
鳴
謝:-)
1.52004-08-28?根據(jù)網(wǎng)友審稿意見修改白楊
?在函數(shù)中增加“讓相同的
代碼只出現(xiàn)一次”的條目
?在函數(shù)頭中增加復(fù)雜性描
述
1.62004-11-22?修正了一些筆誤白楊
1.72005-03-30.新增成員函數(shù)的下劃線后白楊
綴命名
1.82005-05-04?小改動(dòng),修正了一些筆誤;白楊
在類命名規(guī)范中增加了宏
面類的概念
1.92005-05-11再次調(diào)整類命名規(guī)范,引入白楊
界面、類型和類的概念
1.102005-06-06新增修改標(biāo)記規(guī)則白楊
1.112005-06-07新增類型和界面的使用策白楊
略
1.122005-06-28修正一些筆誤白楊
1.132005-08-20小幅修正和調(diào)整白楊
1.142005-11-08對(duì)全文再次進(jìn)行修正及調(diào)白楊
整
1.152005-11-14增加數(shù)值前綴的特別記法白楊
1.162005-11-16增加對(duì)復(fù)雜的宏實(shí)行縮進(jìn)白楊
1.172005-11-21補(bǔ)全修改標(biāo)記規(guī)則白楊
在常用注釋中增加一種新
型組注釋
1.182005-12-02在文件頭中增加多線程和白楊
異常時(shí)安全性描述
1.192005-12-25細(xì)化異常過濾器規(guī)則白楊CCF上
.增加特別代碼段注釋規(guī)則的網(wǎng)友,
特別感
謝
smartsl
1.202006-04-03?根據(jù)網(wǎng)友意見修正一些筆白楊
誤
1.212007-02-26.新增DUMMY表意宏白楊
1.222007-07-18白楊
.新增C++異常機(jī)制的實(shí)
現(xiàn)方式和開銷分析
1.232007-11-22.新增私有成員函數(shù)的層次白楊
結(jié)構(gòu)表示
1.242008-01-17?措辭和表達(dá)上的細(xì)微調(diào)整白楊CCF上
的
Jiang
Haibin
1.252008-03-12?根據(jù)審稿人建議修正一些白楊
錯(cuò)別字,感謝Haibin
兄:)
1.262008-06-26.新增“針對(duì)C程序員的快白楊
速回顧”-節(jié)
1.272008-07-27?修正一些錯(cuò)別字白楊
目錄
?針對(duì)C程序員的快速回顧
.語法高亮與字體
O字體
O語法高亮
?文件結(jié)構(gòu)
O文件頭注釋
O頭文件
O內(nèi)聯(lián)函數(shù)定義文件
O實(shí)現(xiàn)文件
O文件的組織結(jié)構(gòu)
.命名規(guī)則
O類/結(jié)構(gòu)
O函數(shù)
O變量
O常量
O枚舉、聯(lián)合、typedef
o宏、枚舉值
o名空間
?代碼風(fēng)格與版式
o類/結(jié)構(gòu)
o函數(shù)
O變量、常量
O枚舉、聯(lián)合、typedef
o宏
o名空間
oW
o修改標(biāo)記
?版本控制
?自動(dòng)工具與文檔生成
?英文版
關(guān)于本規(guī)范的貫徹實(shí)施
術(shù)語表
參考文獻(xiàn)
C++成長篇
與我聯(lián)系
附件
.常用注釋一覽
.常用英文注釋一覽
.文件頭例子
.頭文件例子
.實(shí)現(xiàn)文件例
.內(nèi)聯(lián)函數(shù)定義文件例子
.類/結(jié)構(gòu)的風(fēng)格與版式例子
.函數(shù)的風(fēng)格與版式例子
.RTTI、虛函數(shù)和虛基類的開銷分析和使用指導(dǎo)
.C++異常機(jī)制的實(shí)現(xiàn)方式和開銷分析
4
概述
對(duì)于任何工程項(xiàng)目來說,統(tǒng)一的施工標(biāo)準(zhǔn)都是保證工程質(zhì)量的重要因素???/p>
稱當(dāng)今人類最抽象、最復(fù)雜的工程一一軟件工程,自然更加不能例外。
高品質(zhì)、易維護(hù)的軟件開發(fā)離不開清晰嚴(yán)格的編碼規(guī)范。本文檔詳細(xì)描述C++
軟件開發(fā)過程中的編碼規(guī)范。本規(guī)范也適用于所有在文檔中出現(xiàn)的源碼。
除了“語法高亮”部分,本文檔中的編碼規(guī)范都以:
規(guī)則(或建議)解釋
的格式給出,其中強(qiáng)制性規(guī)則使用黑色,建議性規(guī)則使用灰色。
4
針對(duì)C程序員的快速回顧
本節(jié)旨在較高層面上快速回顧c與C++的主要區(qū)別。專門針對(duì)c思想根
深蒂固的老咖和經(jīng)常需要在C/C++項(xiàng)目間頻繁切換的coderoC與C++
的主要區(qū)別包括:
?空參函數(shù)聲明的默認(rèn)參數(shù)類型為void而不是int[編譯時(shí)]。
?強(qiáng)類型檢查和專門的類型轉(zhuǎn)換操作[編譯時(shí),除dynamic_cast操
作]。
?名空間:用于歸類接口和模塊以及防止重名。名空間有自動(dòng)向父級(jí)查
詢匹配和凱氏匹配。名空間的一個(gè)副作用是名稱粉碎,可以用extern
"C"聲明解決[編譯時(shí)]。
?類:類將一個(gè)C結(jié)構(gòu)體和與之相關(guān)的函數(shù)打包在一起,并且提供了
編譯時(shí)的訪問控制檢查,為了擬真內(nèi)置類型,還提供了操作符重載
[編譯時(shí)]。
?類層次結(jié)構(gòu):類可以通過相互間的繼承和派生形成層次結(jié)構(gòu),派生類
繼承了基類的數(shù)據(jù)結(jié)構(gòu)和方法[編譯時(shí)]。
?模板:本質(zhì)上是類型參數(shù)化。在編譯時(shí)生成C++代碼的過程叫做模
板實(shí)例化,默認(rèn)的實(shí)例化點(diǎn)在當(dāng)前編譯單元第一次使用該模板時(shí),也
可以通過顯式實(shí)例化來增加編譯速度。通過部分或完全的專門化可以
為指定類型提供優(yōu)化算法[編譯時(shí)]。
?抽象類和虛方法:可以通過基類指針或引用訪問的動(dòng)態(tài)重載技術(shù)
[運(yùn)行時(shí)]。
?多重繼承和虛基類:一個(gè)類可以有多個(gè)父親,為了避免層次結(jié)構(gòu)中出
現(xiàn)重復(fù)的基類,C++提供了虛基類[運(yùn)行時(shí)]。
?運(yùn)行時(shí)類型信息(RTTI):允許程序員在類層次結(jié)構(gòu)中漫游;完成動(dòng)
態(tài)轉(zhuǎn)換(向上、向下和交叉強(qiáng)制);獲取指定類型的typeid信息,
用戶可以以此為基礎(chǔ)實(shí)現(xiàn)反射-、高級(jí)調(diào)試等各類功能。
?異常處理:本質(zhì)上是一種安全的longjmp機(jī)制,在退棧期間能夠完
成必要的對(duì)象析構(gòu)動(dòng)作。主要用于在發(fā)生錯(cuò)誤時(shí)跳轉(zhuǎn)到相應(yīng)的錯(cuò)誤處
理分支。
T
語法高亮與字體
字體
文字是信息的載體;文字使我們能夠把個(gè)人的經(jīng)驗(yàn)和思想長久的保存下來;
文字使我們得以站在前人的肩膀上向前發(fā)展;文字的誕生標(biāo)志著人類文明
的開始...
扯的太離譜了?好吧,至少你應(yīng)該承認(rèn):
?沒有文字就不可能出現(xiàn)計(jì)算機(jī)(先不管他是哪國字尊)
?沒有文字大家就不可能(也沒必要)學(xué)會(huì)如何寫程序
?在過去、現(xiàn)在和可見的將來,使用文字符號(hào)都是編寫計(jì)算機(jī)軟件的
主要方式方法啰
既然文字如此重要,它的長相自然會(huì)受到廣泛的關(guān)注。如今這個(gè)連MM都可
以“千面”的年頭,字體的種類當(dāng)然是數(shù)不勝數(shù)。
然而,前輩先賢們?cè)?jīng)用篆體教導(dǎo)偶們:腎喜釀?wù)盏趼榘偈?/p>
想讓大家讀到縮進(jìn)、對(duì)齊正確一致,而且不出現(xiàn)亂碼的源文件,我們就要
使用相互兼容的字體。
字體規(guī)范如下:
使用等寬字體由于非等寬字體在對(duì)齊等方面問題多多,任
何色況下,源碼都必須使用等寬字體編輯和
顯不。
每個(gè)制表符(TAB)的寬不一致的縮進(jìn)寬度會(huì)導(dǎo)致行與行之間的參
度為4個(gè)半角字符差不齊,進(jìn)而嚴(yán)重影響代碼的可讀性。
優(yōu)先使用Fixedsys在Windows平臺(tái)中,應(yīng)該優(yōu)先使用字體:
Fixedsys,這也是操作系統(tǒng)UI(所有的菜單、
按鈕、標(biāo)題欄、對(duì)話框等等)默認(rèn)使用的字
體。該字體的好處很多:
?兼容性好:所有Windows平臺(tái)都支持
該字體
?顯示清晰:該字體為點(diǎn)陣字體,相對(duì)
于矢量字體來說在顯示器中呈現(xiàn)的
影像更為清晰。矢量字體雖然可以自
由縮放,但這個(gè)功能對(duì)于純文本格式
的程序源碼來說沒有任何實(shí)際作用。
而且當(dāng)顯示字號(hào)較?。?2pt以下)時(shí),
矢量字體還有一些明顯的缺陷:
o文字的邊緣會(huì)有嚴(yán)重的凹凸
感。
O一些筆畫的比例也會(huì)失調(diào)。
。開啟了柔化字體邊緣后,還會(huì)
使文字顯得模糊不清。
說句題外話,這也是Gnome和KDE等
其它GUI環(huán)境不如Windows的一個(gè)重
要方面。
?支持多語言:Fixedsys是UNICODE
字體,支持世界上幾乎所有的文字符
號(hào)。這對(duì)編寫中文注釋是很方便的。
語法高亮
幾乎所有的現(xiàn)代源碼編輯器均不同在程度上支持語法高亮顯示的功能。繽
紛的色彩不但可以吸引MM們的目光,還可以在很大程度上幫助我們閱讀那
些奧澀如咒語般的源代碼。
統(tǒng)一的語法高亮規(guī)則不僅能讓我們望色生意,還可以幫助我們閱讀沒有編
碼規(guī)范,或者規(guī)范執(zhí)行很爛的源碼。
所有在文檔中出現(xiàn)的代碼段均必須嚴(yán)格符合下表定義的語法高亮規(guī)范。在
編輯源碼時(shí)一,應(yīng)該根據(jù)編輯器支持的自定義選項(xiàng)最大限度地滿足卜一表定義
的高亮規(guī)范。
類型顏色舉例
注釋//注釋例子
■R0;G128;B0(深綠)
關(guān)鍵字
■R0;G0;B255(藍(lán))typedef,int,
dynamic_cast
class...
類、結(jié)構(gòu)、聯(lián)合、枚class
■R0;G0;B255(藍(lán))
舉等其它自定義類型CMyClass,
enum
ERRTYPE,
typedefint
CODE...
名空間■R0;G0;B255(藍(lán))namespace
BaiY
數(shù)字■R255;G0;B0(紅)012119u
Oxff...
字符、字符串■R0;G128;B128(深藍(lán)綠)"string",'c...
宏定義、枚舉值■R255;G128;B0(橙黃)#define
UNICODE,
enum{RED,
GREEN,
BLUE);
操作符<>,=+-*/;
■R136;G0;B0(棕色)
{}()[]...
方法/函數(shù)■lU36;G0;B0(棕色)MyFunc()
變量■R128;G128;B128(中灰色)intnMyVar;
背景
R255;G255;B255(白色)
其它otherthings
■RO;GO;BO(黑色)
(通常是一
個(gè)錯(cuò)誤)
1
文件結(jié)構(gòu)
文件頭注釋
所有C++的源文件均必須包含一個(gè)規(guī)范的文件頭,文件頭包含了該文件的名稱、
功能概述、作者、版權(quán)和版本歷史信息等內(nèi)容。標(biāo)準(zhǔn)文件頭的格式為:
/*!@file
<PRE>
模塊名:〈文件所屬的模塊名稱》
文件名:〈文件名〉
相關(guān)文件:(與此文件相關(guān)的其它文件>
文件實(shí)現(xiàn)功能:〈描述該文件實(shí)現(xiàn)的主要功能〉
作者:(作者部門和姓名〉
版本:(當(dāng)前版本號(hào)>
多線程安全性:〈是/否>[,說明]
異常時(shí)安全性:<是/否>[,說明]
備注:〈其它說明,
修改記錄:
日期版本修改人修改內(nèi)容
YYYY/MM/DDX.Y〈作者或修改者名〉〈修改內(nèi)容〉
</PRE>
如果該文件有其它需要說明的地方,還可以專門為此擴(kuò)展一節(jié),節(jié)與節(jié)之間用
長度為80的“=”帶分割:
/*!@file
<PRE>
模塊名:<文件所屬的模塊名稱>
文件名:〈文件名〉
相關(guān)文件:〈與此文件相關(guān)的其它文件〉
文件實(shí)現(xiàn)功能:〈描述該文件實(shí)現(xiàn)的主要功能〉
作者:(作者部門和姓名〉
版本:〈當(dāng)前版本號(hào)〉
多線程安全性:<是/否>[,說明]
異常時(shí)安全性:<是/否>[,說明]
備注:〈其它說明〉
修改記錄:
日期版本修改人修改內(nèi)容
YYYY/MM/DDX.Y〈作者或修改者名〉〈修改內(nèi)容〉
</PRE>
*項(xiàng)目1
-項(xiàng)目1.1
-項(xiàng)目1.2
*項(xiàng)目2
-項(xiàng)目2.1
-項(xiàng)目2.2
每行注釋的長度都不應(yīng)該超過80個(gè)半角字符。還要注意縮進(jìn)和對(duì)齊,以利閱讀。
注意:將多線程和異常時(shí)安全性描述放在文件頭,而不是類或者函數(shù)注釋中,
是為了體現(xiàn)以下設(shè)計(jì)思想:同一個(gè)模塊中的界面,其各方面的操作方式和使用
風(fēng)格應(yīng)該盡量保持一致。
關(guān)于文件頭的完整例子,請(qǐng)參見:文件頭例子
關(guān)于文件頭的模板,請(qǐng)參見:文件頭注釋模板
頭文件
頭文件通常由以下幾部分組成:
文件頭注釋每個(gè)頭文件,無論是內(nèi)部的還是外部的,都
應(yīng)該由一個(gè)規(guī)范的文件頭注釋作為開始。
預(yù)處理塊為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用
ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊。
函數(shù)和類/結(jié)構(gòu)的聲明等聲明模塊的接口
需要包含的內(nèi)聯(lián)函數(shù)定如果類中的內(nèi)聯(lián)函數(shù)較多,或者一個(gè)頭文件
義文件(如果有的話)中包含多個(gè)類的定義(不推薦),可以將所
有內(nèi)聯(lián)函數(shù)定義放入一個(gè)單獨(dú)的內(nèi)聯(lián)函數(shù)
定義文件中,并在類聲明之后用
“#include”指令把它包含進(jìn)來。
頭文件的編碼規(guī)則:
引用文件的格式用#include^filename.h>格式來引用標(biāo)
準(zhǔn)庫和系統(tǒng)庫的頭文件(編譯器將從標(biāo)準(zhǔn)庫
目錄開始搜索)。
用ttincludefilename,h*格式來引用當(dāng)
前工程中的頭文件(編譯器將從該文件所在
目錄開始搜索)。
分割多組接口(如果有的如果在一個(gè)頭件中定義了多個(gè)類或者多組
話)接口(不推薦),為了便于瀏覽,應(yīng)該在每
個(gè)類/每組接1」間使用分割帶把它們相互分
開。
關(guān)于頭文件的完整例子,請(qǐng)參見:頭文件例子
內(nèi)聯(lián)函數(shù)定義文件
如上所述,在內(nèi)聯(lián)函數(shù)較多的情況下,為了避免頭文件過長、版面混亂,
可以將所有的內(nèi)聯(lián)函數(shù)定義移到一個(gè)單獨(dú)的文件中去,然后再用#include
指令將它包含到類聲明的后面。這樣的文件稱為一個(gè)內(nèi)聯(lián)函數(shù)定義文件。
按照慣例,應(yīng)該將這個(gè)文件命名為"filename.,其中"filename"
與相應(yīng)的頭文件和實(shí)現(xiàn)文件相同。
內(nèi)聯(lián)函數(shù)定義文件由以下幾部分組成:
文件頭注釋每內(nèi)聯(lián)函數(shù)定義文件都應(yīng)該由一個(gè)規(guī)范的
文件頭注釋作為開始
內(nèi)聯(lián)函數(shù)定義內(nèi)聯(lián)函數(shù)的實(shí)現(xiàn)體
內(nèi)聯(lián)函數(shù)定義文件的編碼規(guī)則:
分割多組接口(如果有的如果在一個(gè)內(nèi)聯(lián)函數(shù)定義文件中定義了多
話)個(gè)類或者多組接口的內(nèi)聯(lián)函數(shù)(不推薦),
必須在每個(gè)類/每組接U間使用分割帶把它
們相互分開。
文件組成中為什么沒有與頭文件不同,內(nèi)聯(lián)函數(shù)定義文件通常不需
預(yù)處理塊?要定義預(yù)處理塊,這是因?yàn)樗ǔ1话?/p>
與其相應(yīng)的頭文件預(yù)處理塊內(nèi)。
關(guān)于內(nèi)聯(lián)函數(shù)定義文件的完整例子,請(qǐng)參見:內(nèi)聯(lián)函數(shù)定義文件例子
實(shí)現(xiàn)文件
實(shí)現(xiàn)文件包含所有數(shù)據(jù)和代碼的實(shí)現(xiàn)體。實(shí)現(xiàn)文件的格式為:
文件頭注釋每個(gè)實(shí)現(xiàn)文件都應(yīng)該由一個(gè)規(guī)范的文件頭
注釋作為開始
對(duì)配套頭文件的引用引用聲明了此文件實(shí)現(xiàn)的類、函數(shù)及數(shù)據(jù)的
頭文件
對(duì)一些僅用于實(shí)現(xiàn)的頭將僅與實(shí)現(xiàn)相關(guān)的接口包含在實(shí)現(xiàn)文件里
文件的引用(如果有的(而不是頭文件中)是一個(gè)非常好的編程習(xí)
話)慣。這樣可以有效地屏蔽不應(yīng)該暴露的實(shí)現(xiàn)
細(xì)節(jié),將實(shí)現(xiàn)改變對(duì)其它模塊的影響降低到
最少。
程序的實(shí)現(xiàn)體數(shù)據(jù)和函數(shù)的定義
實(shí)現(xiàn)文件的編碼規(guī)則:
分割每個(gè)部分在本地(靜態(tài))定義和外部定義問,以及不
同接口或不同類的實(shí)現(xiàn)之間,應(yīng)使用分割帶
相互分開。
關(guān)于實(shí)現(xiàn)文件的完整例子,請(qǐng)參見:實(shí)現(xiàn)文件例子
文件的組織結(jié)構(gòu)
由于項(xiàng)目性質(zhì)、規(guī)模上存在著差異,不同項(xiàng)目間的文件組織形式差別很大。
但文件、目錄組織的基本原則應(yīng)當(dāng)是一致的:使外部接口與內(nèi)部實(shí)現(xiàn)盡量
分離;盡可能清晰地表達(dá)軟件的層次結(jié)構(gòu)……
為此提供兩組典型項(xiàng)目的文件組織結(jié)構(gòu)范例作為參考:
功能模塊/庫的文件組織形式
顯而易見,編寫功能模塊和庫的主要目的是為其它模塊提供一套
完成特定功能的API,這類項(xiàng)目的文件組織結(jié)構(gòu)通常如下圖所示:
0
自LibSaample
acontrib
adoc
ninclude
0lib
amakefile
asrc
test
其中:
contrib當(dāng)前項(xiàng)目所依賴的所有第三方軟
件,可以按類別分設(shè)子目錄。
doc項(xiàng)目文檔
include聲明外部接口的所有頭文件和內(nèi)
聯(lián)定義文件。
lib編譯好的二進(jìn)制庫文件,可以按編
譯器、平臺(tái)分設(shè)子目錄。
makefile用于編譯項(xiàng)目的makefile文件和
project文件等。可以按編譯器、
平臺(tái)分設(shè)子目錄。
src所有實(shí)現(xiàn)文件和聲明內(nèi)部接口的
頭文件、內(nèi)聯(lián)定義文件??砂垂δ?/p>
劃分;支持編譯器、平臺(tái)等類別分
設(shè)子目錄。
test存放測(cè)試用代碼的目錄。
應(yīng)用程序的文件組織形式
與功能模塊不同,應(yīng)用程序是一個(gè)交付給最終用于使用的、可以
獨(dú)立運(yùn)行并提供完整功能的軟件產(chǎn)品,它通常不提供編程接口,
應(yīng)用程序的典型文件組織形式如下圖所示:
□oSSHSI
◎contrib
&doc
Omakefile
iOsetup
◎src
Otest
contrib當(dāng)前項(xiàng)目所依賴的所有第三方軟
件,可以按類別分設(shè)子目錄。
doc項(xiàng)目文檔
makefile用于編譯項(xiàng)目的makefile文件和
project文件等??梢园淳幾g器、
平臺(tái)分設(shè)子目錄。
setup安裝程序,以及制作安裝程序所需
要的項(xiàng)目文件和角本。
src所有源文件??砂垂δ軇澐郑恢С?/p>
編譯器、平臺(tái)等類別分設(shè)子目錄。
test存放測(cè)試用代碼的目錄。
T
命名規(guī)則
如果想要有效的管理一個(gè)稍微復(fù)雜一點(diǎn)的體系,針對(duì)其中事物的一套統(tǒng)一、帶層
次結(jié)構(gòu)、清晰明了的命名準(zhǔn)則就是必不可少而且非常好用的工具。
活躍在生物學(xué)、化學(xué)、軍隊(duì)、監(jiān)獄、黑社會(huì)、恐怖組織等各個(gè)領(lǐng)域內(nèi)的大量有識(shí)
先輩們都曾經(jīng)無數(shù)次地以實(shí)際行動(dòng)證明了以上公理的正確性。除了上帝(設(shè)它可
以改變世間萬物的秩序)以外,相信沒人有實(shí)力對(duì)它不屑一顧丁’
在軟件開發(fā)這一高度抽象而且十分復(fù)雜的活動(dòng)中,命名規(guī)則的重要性更顯得尤為
突出。一套定義良好并且完整的、在整個(gè)項(xiàng)目中統(tǒng)一使用的命名規(guī)范將大大提升
源代碼的可讀性和軟件的可維護(hù)性。
在引入細(xì)節(jié)之前,先說明一下命名規(guī)范的整體原則:
同一性在編寫一個(gè)子模塊或派生類的時(shí)候,要遵循其基
類或整體模塊的命名風(fēng)格,保持命名風(fēng)格在整個(gè)
模塊中的同一性。
標(biāo)識(shí)符組成標(biāo)識(shí)符采用英文單詞或其組合,應(yīng)當(dāng)直觀且可以
拼讀,可望文知意,用詞應(yīng)當(dāng)準(zhǔn)確。
最小化長度&&最大化在保持一個(gè)標(biāo)識(shí)符意思明確的同時(shí),應(yīng)當(dāng)盡量縮
信息量原則短其長度。
避免過于相似不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符,例如
“i”與"I”,"function"與"Function"等
等。
避免在不同級(jí)別的作用程序中不要出現(xiàn)名字完全相同的局部變量和全
域中重名局變量,盡管兩者的作用域不同而不會(huì)發(fā)生語法
錯(cuò)誤,但容易使人誤解。
正確命名具有互斥意義用正確的反義詞組命名具有互斥意義的標(biāo)識(shí)符,
的標(biāo)識(shí)符如:〃nMinValue"和"nMaxValue","GetName()〃
和“SetName()〃.??.
避免名字中出現(xiàn)數(shù)字編盡量避免名字中出現(xiàn)數(shù)字編號(hào),如
號(hào)
Valuel,Value2等,除非邏輯上的確需要編號(hào)。
這是為了防止程序員偷懶,不肯為命名動(dòng)腦筋而
導(dǎo)致產(chǎn)生無意義的名字(因?yàn)橛脭?shù)字編號(hào)最省
事)。
類/結(jié)構(gòu)
除了異常類等個(gè)別情況(不希望被用戶看作一個(gè)普通的、正常的類之情況)
外,C++類/結(jié)構(gòu)的命名應(yīng)該遵循以F準(zhǔn)則:
C++類/結(jié)構(gòu)的命名類的名稱都要以大寫字母“C”開頭,后跟
一個(gè)或多個(gè)單詞。為便于界定,每個(gè)單詞的
首字母要大寫。
特別地,由于界面與其它類概念上的巨大差
別,規(guī)定界面類要以大寫字母“I”開頭。
界面類描述一個(gè)服務(wù)(一組被命名的操作集
合),在C++中,界面與其它類間的最大
區(qū)別在于,界面類中不包含任何數(shù)據(jù)結(jié)構(gòu)
(屬性),也不包括任何具體的操作和實(shí)現(xiàn),
界面類通常僅包含一組純虛函數(shù)的聲明而
不包含任何實(shí)現(xiàn)和數(shù)據(jù)。在一些其它語言
中,一個(gè)界面也被稱作一個(gè)接口及其實(shí)現(xiàn)契
約。
另一個(gè)與接口相似的概念是類型,類型與接
口的不同點(diǎn)在于,類型可以包含部分接口的
實(shí)現(xiàn)或包含一些接口默認(rèn)的或不完整的實(shí)
現(xiàn),一個(gè)類型也可以包含一些屬性。規(guī)定類
型類要以大寫字母“T”開頭。例如:轎車
類型〃TCar”、線程類型"TThread”等等。
在C++種,類型類也叫做結(jié)點(diǎn)類。
在現(xiàn)實(shí)世界中,類型和界面的區(qū)別往往比較
微妙。在真實(shí)代碼中,有些類除了包含純虛
函數(shù)以外,也可能同時(shí)包含幾個(gè)帶簡單默認(rèn)
實(shí)現(xiàn)的普通虛函數(shù)。例如:某個(gè)類中可能包
含一個(gè)(非純虛)虛方法IsLoadable,并
定義了該方法的默認(rèn)實(shí)現(xiàn):returnfalse;(.
我們不難找出很多類似的例子。
以下是一些類型和界面的界定策略:
?如果一個(gè)類中包含靜態(tài)成員,則一定
不是界面
?如果一個(gè)類中包含屬性,則一定不是
界面
?如果■?個(gè)類中包含非虛方法,則一定
不是界面
?如果一個(gè)類中包含非公有成員,則一
定不是界面
?如果■?個(gè)類中包含模板方法,則一定
不是界面。
這里的模板方法是指那些調(diào)用了該
類中其它虛函數(shù)的成員,這樣的方法
通常用于實(shí)現(xiàn)針對(duì)某種應(yīng)用的算法
框架,這顯然超出了界面的范疇。
在C++中,模板方法的另一個(gè)意思
通常指使用函數(shù)模板的成員,由于C
++函數(shù)模板只能是非虛的,所以包
含這種方法的類也一定不是界面。
?通常定義那些不十分明確的接口時(shí),
先將其指定為一個(gè)界面,必要時(shí)再把
它提升為一個(gè)類型。
模板類的命名規(guī)范與實(shí)體類相同。
推薦的組成形式類的命名推薦用"名詞"或"形容詞+名詞”
的形式,例如:〃CAnalyzer〃,
〃CFastVector","IUnknown”,
,,IDBWriter/,,〃TTimer〃,〃TThread〃....
不同于C++類的概念,傳統(tǒng)的C結(jié)構(gòu)體只是一種將一組數(shù)據(jù)捆綁在一起的方
式。傳統(tǒng)c結(jié)構(gòu)體的命名規(guī)則為:
傳統(tǒng)c結(jié)構(gòu)體的命名傳統(tǒng)c結(jié)構(gòu)體的名稱全部由大寫字母組成,
單詞間使用下劃線界定,例如:
"SERVICE_STATUS","DRIVERJNFO"....
函數(shù)
函數(shù)的命名函數(shù)的名稱由一個(gè)或多個(gè)單詞組成。為便于
界定,每個(gè)單詞的首字母要大寫。
推薦的組成形式函數(shù)名應(yīng)當(dāng)使用〃動(dòng)詞〃或者〃動(dòng)詞+名詞〃
(動(dòng)賓詞組)的形式。例如:〃GetName()〃,
z/SetValue()〃,,zErase()〃,
“Reserve()〃....
保護(hù)成員函數(shù)保護(hù)成員函數(shù)的開頭應(yīng)當(dāng)加上一個(gè)下劃線
以示區(qū)別,例如:"SetState
私有成員函數(shù)類似地,私有成員函數(shù)的開頭應(yīng)當(dāng)加上兩個(gè)
下劃線“一”,例如:
“_Destroylmp()"....
私有成員函數(shù)的層次結(jié)通常來說,在一個(gè)類中,公有方法、保護(hù)方
構(gòu)表小法和私有方法所完成的任務(wù)總是呈現(xiàn)一種
逐級(jí)依次細(xì)化的層次結(jié)構(gòu)(意即:保護(hù)方法
所實(shí)現(xiàn)的功能通常比該類中的公有方法更
為細(xì)小瑣碎;類似地,私有方法的功能也比
其保護(hù)方法更具原子性)。
因此,對(duì)于遵循以上規(guī)則,并且功能較為復(fù)
雜的類,在按照“公有、保護(hù)、私有”的三
級(jí)形式劃分以后,如果其私有成員中仍然存
在明顯不同的功能粒度,則可以通過追加更
多下劃線前綴的形式予以表示。
例如:由三個(gè)下劃線開頭的私有方法
“—PushCdr”就要比同一類中,僅由兩個(gè)
下劃線開頭的私有方法
“_MergeConCall”所完成的功能粒度更
細(xì)小、更瑣碎;而四個(gè)下劃線開頭的
CalcCompensate"則比
”__PushCdr”完成的功能更具原子性。
如果發(fā)現(xiàn)類中的功能層數(shù)太多(從公有方法
到最“原子”的私有方法間,一般不應(yīng)該超
過7層),那通常反應(yīng)一個(gè)不良的設(shè)計(jì)。
此時(shí)請(qǐng)檢查這個(gè)類的功能是否過于臃腫,已
使接口顯得不太清晰。另外一個(gè)常見的問題
是將無需訪問該類中數(shù)據(jù)成員的功能定義
成了方法。第一個(gè)問題可以通過重新劃分類
層次結(jié)構(gòu)或?qū)⒁粋€(gè)類分裂為多個(gè)類等方法
解決。對(duì)于第二個(gè)問題,由于這些方法無
需訪問屬性,大多數(shù)時(shí)候都可以把它們轉(zhuǎn)變
成局部函數(shù)(放在無名空間或使用
“static”前綴定義)。
成員函數(shù)的卜劃線后綴對(duì)一些本應(yīng)該作為保護(hù)或私有成員的函數(shù),
命名由于設(shè)計(jì)方面的其它考慮(例如:靈活性、
功能等方面)將其提升為公有成員的,應(yīng)該
在其后面添加與其原本訪問控制級(jí)別相應(yīng)
的下劃線后綴。
另外,對(duì)于其它不推薦直接使用的成員函數(shù)
(例如:會(huì)引起兼容性或可移植性方面問題
的函數(shù)),也應(yīng)當(dāng)在其后面加相應(yīng)下劃線提
ZJ'xO
例如:"SetSysOpt_()”,
〃GetSysOpt_()”,"PreParser_()”.???
回調(diào)和事件處理函數(shù)回調(diào)和事件處理函數(shù)習(xí)慣以單詞“On”開
頭。例如:〃_OnTimer()〃,“OnExit()〃.??.
虛函數(shù)回調(diào)函數(shù)以外的虛函數(shù)習(xí)慣以“Do”開頭,
如:^DoRefresh()”,
z,_DoEncryption()〃....
變量
變量應(yīng)該是程序中使用最多的標(biāo)識(shí)符了,變量的命名規(guī)范可能是一套C++
命名準(zhǔn)則中最重要的部分:
變量的命名變量名由作用域前綴+類型前綴+一個(gè)或
多個(gè)單詞組成。為便于界定,每個(gè)單詞的首
字母要大寫。
對(duì)于某些用途簡單明了的局部變量,也可以
使用簡化的方式,如:i,j,k,x,y,z....
作用域前綴作用域前綴標(biāo)明一,1、變量的可見范圍。作用
域可以有如下幾種:
前綴說明
無局部變量
m_類的成員變量
(member)
sm_類的靜態(tài)成員變量
(staticmember)
s_靜態(tài)變量(static)
g_外部全局變量
(global)
Sg_靜態(tài)全局變量(static
global)
gg_進(jìn)程間共享的共享數(shù)
據(jù)段全局變量(global
global)
除非不得已,否則八〃該盡可能少使用全局變
量。
類型前綴類型前綴標(biāo)明一個(gè)I變量的類型,可以有如下
幾種:
前綴說明
n整型和位域變量
(number)
e枚舉型變量
(enumeration)
c字符型變量(char)
b布爾型變量(bool)
f浮點(diǎn)型變量(float)
P指針型變量和迭代子
(pointer)
pfn指向函數(shù)的指針變量
或指向函數(shù)對(duì)象的指
針(pointerof
function)
pm指向成員的指針
(pointerofmember)
g數(shù)組(grid)
i類的實(shí)例(instance)
對(duì)于經(jīng)常用到的類,也
可以定義一些專門的
前綴,如:std::string
和std::wstring類的
前綴可以定義為"s[’,
std::vector類的前
綴可以定義為"v"等
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 8 Revision Lesson 28(教學(xué)設(shè)計(jì))-2024-2025學(xué)年北京版英語四年級(jí)下冊(cè)
- 2023四年級(jí)數(shù)學(xué)下冊(cè) 一 四則混合運(yùn)算第2課時(shí)教學(xué)設(shè)計(jì) 西師大版
- Unit 1 You and Me Section A 1a~1d How Do We Get to Know Each Other教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版(2024)七年級(jí)英語上冊(cè)
- 8網(wǎng)絡(luò)新世界 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治四年級(jí)上冊(cè)(統(tǒng)編版)
- 3 曲曲直直(教學(xué)設(shè)計(jì))人教版(2012)美術(shù)三年級(jí)下冊(cè)
- 2024秋四年級(jí)英語上冊(cè) Unit 5 Dinners ready Part B 第2課時(shí)教學(xué)設(shè)計(jì) 人教PEP
- 2023四年級(jí)數(shù)學(xué)下冊(cè) 3 運(yùn)算律第5課時(shí) 乘法分配律配套教學(xué)設(shè)計(jì) 新人教版
- 美術(shù)課課件制作
- 《0×5 =?》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)北師大版
- Unit 6 rain or shine Section A Grammar英文版教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版(2024)七年級(jí)英語下冊(cè)
- 人教版小學(xué)四年級(jí)數(shù)學(xué)下冊(cè)《第三單元 運(yùn)算律》大單元整體教學(xué)設(shè)計(jì)2022課標(biāo)
- 中班音樂《月亮婆婆喜歡我》課件
- 網(wǎng)絡(luò)輿情風(fēng)險(xiǎn)評(píng)估與預(yù)警
- 學(xué)做麥糊燒課件
- 內(nèi)蒙古師范大學(xué)定向協(xié)議書
- T-CTSS 86-2024 原味茶飲料標(biāo)準(zhǔn)
- 南航社會(huì)招聘筆試題目
- 北師大版四年級(jí)下冊(cè)小數(shù)乘法豎式計(jì)算200題及答案
- 燃料電池汽車講解
- DL∕T 5161.17-2018 電氣裝置安裝工程質(zhì)量檢驗(yàn)及評(píng)定規(guī)程 第17部分:電氣照明裝置施工質(zhì)量檢驗(yàn)
- 金蟬養(yǎng)殖注意事項(xiàng)及常見病蟲害防治
評(píng)論
0/150
提交評(píng)論