C++編碼規(guī)范與指導(dǎo)_第1頁
C++編碼規(guī)范與指導(dǎo)_第2頁
C++編碼規(guī)范與指導(dǎo)_第3頁
C++編碼規(guī)范與指導(dǎo)_第4頁
C++編碼規(guī)范與指導(dǎo)_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論