国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

《C++編碼規范》修訂說明

2019-11-17 05:26:46
字體:
來源:轉載
供稿:網友

  目錄p11:

原則23.22 代碼中用到的路徑只用“/”而不要用“/”··· 196

更改為

原則23.22 代碼中用到的路徑只用“/”而不要用“”··· 196

正文P1倒數第2行:

多態:父類和子類可以為同一個接口(復用)提供不同的實現,外部代碼不需任何改動(復用)就可以擁有不同的特性。

更改為

多態:不同子類可以為同一個父類接口(復用)提供不同的實現,外部代碼不需任何改動(復用)就可以擁有不同的特性。



正文P6原則1.2 關于變量和函數名

1.2.1 說明

……(同時參閱:“原則1.7 關于匿名命名空間級標識符的前綴”、……)

更改為

……(同時參閱:“原則1.7 關于全局命名空間級標識符的前綴”、……)

正文P9原則1.4 關于宏、常量和模板

1.4.2 例子

// 常量類的宏

#define PIE 3.1415926

// 函數類的宏

#define MAX( a,b ) (/* … */)

// 常量

const int LENGTH = 1024;

// 枚舉中的常量成員

更改為

// 常量類的宏PIE

#define PIE 3.1415926

// 函數類的宏MAX

#define MAX( a,b ) (/* … */)

// 常量LENGTH

const int LENGTH = 1024;

// 枚舉中的常量成員BLUE, RED, WHITE

(還有幾處類似的添加)

正文P12原則1.7上面

合理的命名方式肯定在這兩個極端中間的某處,但具體在哪里有賴于大家自己的判定。

更改為

合理的命名方式肯定在這兩個極端中間的某處,但具體在哪里有賴于大家自己的判定。不過,一個組織或部門內部最好統一意見,以方便大家互相理解交流。



正文P12原則1.7 關于匿名命名空間級標識符的前綴

原則1.7 關于匿名命名空間級標識符的前綴

1.7.1 說明

給匿名命名空間級標識符一個公共前綴(如所屬Package名或Library名,加下劃線),用來區別其他提供類似功能的Packet或Library等。

匿名命名空間中的標識符指的是全局或文件級變量名、常量名、宏、類型名、函數名等。

更改為

原則1.7 關于全局命名空間級標識符的前綴

1.7.1 說明

給全局命名空間(匿名,全局變量缺省所屬的那個命名空間,以下同)級標識符一個公共前綴(如所屬Package名或Library名,加下劃線),用來區別其他提供類似功能的Packet或Library等。

全局命名空間中的標識符指的是全局或文件級變量名、常量名、宏名、類型名、函數名等。

正文P13原則1.7 關于匿名命名空間級標識符的前綴

1.7.3 原因

假如希望代碼復用,則匿名命名空間級標識符就需要防止命名沖突。

更改為

假如希望代碼復用,則全局命名空間級標識符就需要防止命名沖突。



正文P13原則1.8 減少匿名命名空間級標識符

原則1.8 減少匿名命名空間級標識符

1.8.1 說明

盡量減少匿名命名空間級變量、常量、宏及函數等標識符。……

更改為

原則1.8 減少全局命名空間級標識符

1.8.1 說明

盡量減少全局命名空間級變量、常量、宏及函數等標識符。……

正文P13原則1.8 減少匿名命名空間級標識符

……

1.8.2 例子

class CommonDefinition_T …

{

public :

const float PIE;

// …

};

更改為

1.8.2 例子

class CommonDefinition_T …

{

public :

const float PIE; // 現在常量PIE不再是全局的

// …

};

正文P13原則1.8 減少匿名命名空間級標識符

1.8.3 原因

……

縮短生命周期,使之只存在于它應該發揮作用的有限時間內,從而減少麻煩:更好記、更好維護、不會被誤用或濫用等。

更改為

縮小其有效周期/范圍,使之只存在于它應該發揮作用的有限時間/空間內,從而減少麻煩:更好記、更好維護、不會被誤用或濫用等。

正文P16原則1.12 盡量用英文命名


英語是最通用的語言,非凡是在程序語言中,其他語言(比如選擇漢語拼音)可能造成閱讀者理解上的困難。

更改為

英語是最通用的語言,非凡是在程序語言中,其他語言(比如選擇漢語拼音)可能造成閱讀者理解上的困難,也不利于更大范圍的代碼復用。

正文P18原則1.19 避免名字中出現外形混淆的字母或數字

例子

/*

* 字母O和數字0外形類似,避免混用;實在無

* 法避免,最好總是用小寫,這樣和數字0區別還

* 大一點

*/

更改為

例子

/*-----------------------------------------------------------------

* 字母O和數字0外形類似,避免混用;實在無

* 法避免,字母O最好總是用小寫,這樣和數字0

* 區別還大一點

*-----------------------------------------------------------------*/

(為了區分輕易,本書所有的/*  */的注釋均在上下加了短橫線--------)

正文P26原則2.3 少用浮點數除非必須

原則2.3 少用浮點數除非必須

更改為

原則2.3 少用浮點類型除非必須

C++編碼規范》修訂說明

正文P26原則2.3 少用浮點數除非必須

2.3.1 例子

int baudRate = 9600;

int symbolsIn15msec;

// 使用了浮點數,能避免嗎

更改為

2.3.1 例子

int baudRate = 9600;

int symbolsIn15msec;

// 使用了浮點類型,能避免嗎

正文P26原則2.3 少用浮點數除非必須

2.3.2 原因

……

浮點數的異常處理復雜(比如上溢、下溢等的處理)。

……

更改為

2.3.2 原因

……

浮點類型的異常處理復雜(比如上溢、下溢等的處理)。

……

正文P26原則2.4 用typedef簡化程序中的復雜語法

2.4.1 例子

// 用typedef簡化函數指針

typedef int (*CallbackFuncPtr_T)(int parameter);

更改為

2.4.1 例子

// 用typedef簡化函數指針

typedef int (*CallbackFunctionPtr_T)(int parameter);



正文P26原則2.4 用typedef簡化程序中的復雜語法

2.4.3 定量分析的參考

包含4個以上獨立元素的語法應被視為復雜語法,如上例中的函數指針定義,不算typedef的獨立元素數為5。

更改為

2.4.3 定量分析的參考

包含4個以上獨立元素的語法應被視為復雜語法,如上例中的函數指針定義,不算typedef的獨立元素數為5(int,*,CallbackFunctionPtr_T,int,parameter)。

正文P28

2.7.2 原因

……

減少匿名命名空間級變量、常量、宏及函數。

更改為

符合“原則1.8 減少全局命名空間級標識符”。



正文P30

原則3.1 一定要做到先定義后使用

3.1.1 說明

C++必須這樣做(否則編譯通不過)。C程序沒有強制要求,但也應該先提供原型,再使用函數。

3.1.2 原因

先定義使得編譯器能夠在編譯時就檢查和找出錯誤(而不是等到連接或運行時)。

更改為

原則3.1 函數一定要做到先聲明后使用

3.1.1 說明

C++必須這樣做(否則編譯通不過)。C程序沒有強制要求,但也應該先提供原型,再使用函數。

3.1.2 原因

先聲明使得編譯器能夠在編譯時就檢查和找出錯誤(而不是等到連接或運行時)。

正文P40原則3.17 當函數返回引用或指針時,用文字描述其有效期

3.17.1 說明

有效期是指引用或指針能有效地找到對象的期間。文字描述最好以注釋形式放在函數所在的頭文件中(這樣比較直接)。

更改為

3.17.1 說明

有效期是指引用或指針能有效地找到目標的時間段。文字描述最好以注釋形式放在函數所在的頭文件中(這樣比較直接)。

正文P41

3.18.2 原因

……


返回只讀(常量)的引用或指針還是可接受的。

更改為

關于能否返回只讀(常量)的引用或指針,請參見“原則8.3 類成員可以轉換成常量形式暴露出來”。

正文P41~42

3.20.1 說明

假如我們能把友元函數定義成虛函數,則子類既可以繼續該友元的接口而無需重復聲明友元……

更改為

假如我們能把友元函數定義成虛函數,則子類既可以繼續該函數而無需重復聲明友元……

正文P45原則4.2 類成員應是私有的(PRivate)

4.2.2 原因

更糟的是,任何對類的修改都將影響使用該類的代碼,因為這些代碼有權直接訪問(被修改的)類成員。

更改為

更糟的是,任何對類實現的修改都可能影響使用該類的代碼,因為這些代碼有權直接訪問(被修改的)類成員。

正文p47原則4.5 降低類間的耦合度

4.5.2 例子

經常看到這樣的例子:一個大功能模塊中有許多不同類型的對象,為了協同工作,每類對象都多少帶有其他對象的指針或引用,造成你中有我,我中有你,最終導致一鍋粥,誰也離不開誰。

更改為

4.5.2 例子

經常看到這樣的例子:一個大功能模塊中有許多不同類型的對象,為了協同工作,每類對象內部都多少帶有其他對象的指針或引用,造成你中有我,我中有你,最終導致一鍋粥,誰也離不開誰。

正文p50原則4.9 避免為每個類成員提供訪問函數

原因

……

專注于屬性的類在多線程環境下效率低下。若專注于行為,一次行為會修改一連串相關屬性而只需上一次鎖(在一個成員函數/行為中);而專注于屬性,則不得不每修改一個屬性就上一次鎖(在每個類成員提供訪問函數中),因為要防止多個線程同時調用訪問函數(去修改同一個屬性)。

更改為

……

專注于屬性的類在多線程環境下效率低下。若專注于行為,一次行為會修改一連串相關屬性而只需上一次鎖(在一個成員函數中);而專注于屬性,則不得不每修改一個屬性就上一次鎖(在每個類成員的訪問函數中),因為要防止多個線程同時調用訪問函數(去修改同一個屬性)。

正文p54

原則4.16 用嵌套類的方法減少匿名命名空間類的數量

4.16.1 說明

不需要把所有類的定義都放在匿名命名空間中。嵌套在別的類中的類是不屬于匿名命名空間的。

更改為

原則4.16 用嵌套類的方法減少全局命名空間類的數量

4.16.1 說明

不需要把所有類的定義都放在全局命名空間中。嵌套在別的類中的類是不屬于全局命名空間的。



正文p55

第5章 (面向對象的)繼續

繼續是面向對象語言的一個基本特性。這是一個強大的功能,但必須運用得當,否則發揮不出其特點,甚至適得其反。

更改為

繼續是面向對象語言的一個基本特性。功能強大自不必多言,但“打破封裝”的副作用卻鮮為人知,所以必須運用得當,否則發揮不出其特點,甚至適得其反。

正文p55原則5.2 關于“有”和“由…實現”

5.2.1 說明

(一個類)包含(另一個類)意味著“有一個”或“由…實現”。“私有繼續(private inheritance)”意味著“由…實現”。

更改為

5.2.1 說明

(一個類)包含(另一個類)意味著“有一個”或“由…實現”。“私有繼續(private inheritance)”意味著“由…實現”(和“包含”類似;完全不同于“公共繼續”)。

正文p59

5.5.2 原因

……

與此類似,同層類的個數也不能太多,否則應考慮是否要加一個父類,以便做某種程度上的(新的)抽象,從而減少同層類的個數(這是一種平衡的藝術)。

更改為

與此類似,派生于同一父類的子類個數也不能太多(計劃生育?),否則應考慮是否要加一層父類,通過某種程度上的(新的)抽象,減少同層類的個數(這是一種平衡的藝術)。

正文p59

原則5.6 繼續樹上非葉子節點的類應是虛基類

5.6.1 例子

假如你有兩個(非虛)類C1和C2,且希望C2派生于C1,如圖5-1左邊所示,則應該增加一個虛基類A,且將C1和C2都從A派生出來,如圖5-1右邊所示。

更改為

原則5.6 繼續樹上非葉子節點的類應是抽象基類

5.6.1 例子

假如你有兩個(非抽象)類C1和C2,且希望C2派生于C1,如圖5-1左邊所示,則應該增加一個抽象基類(abstract base class)A,且將C1和C2都從A派生出來,如圖5-1右邊所示。

正文p60

……

進一步說,因為C++的類封裝了具體實現,而只把接口露在外面,所以C1的接口應該是C2最想要繼續的。換句話說,只要C2繼續了C1的接口,C2的對象就可以被看作C1的對象而參與任何C1對象可參與的活動。由此可見,接口本身(而不是具體實現)是參與活動的充分必要條件,這就是為什么A通常是虛基類。

讓我們再換一個角度,繼續的一大缺點是打破封裝,即把基類的實現細節暴露給派生類。導致的結果是,對基類的修改將無法保證不會波及派生類,即基類和派生類是緊耦合關系(緊耦合的缺點請參見“原則4.5 降低類間的耦合度”),除非基類是純虛的(沒有實現細節)。


另外,為了防止多重繼續帶來的各種問題(參見“原則5.14 慎用多重繼續”),也建議繼續樹上非葉子節點的類盡量是沒有成員的純虛基類(類似于java中的Interface)。

更改為

進一步說,因為C++的類封裝了具體實現,而只把接口露在外面,所以C1的接口應該是C2最想要繼續的。換句話說,只要C2繼續了C1的接口,C2的對象就可以被看作C1的對象而參與任何C1對象可參與的活動。由此可見,接口本身(而不是具體實現)是參與活動的充分必要條件,這就是為什么A通常是只定義接口的完全的抽象基類(類似于Java中的Interface)。

用完全抽象基類的另一個原因:繼續存在一個很大的缺陷,就是打破封裝,即把基類的實現細節暴露給派生類。導致的結果是,對基類的修改將無法保證不會波及派生類,即基類和派生類是緊耦合關系(緊耦合的缺點請參見“原則4.5 降低類間的耦合度”),除非基類完全沒有實現細節。

用完全抽象基類的第三個原因:為了防止多重繼續帶來的各種問題(參見“原則5.14 慎用多重繼續”),繼續樹上非葉子節點的類最好沒有成員。

正文p73

6.8.3 原因

防止其后再次使用該指針。

更改為

防止其后再次使用該指針(使用NULL會馬上導致系統錯誤,好查)。

正文p85原則7.19 將循環索引的初值定在循環點四周

7.19.1 例子

假設循環隊列下標從0到MAX-1(MAX為該隊列可容納的元素個數),則隊首應設在MAX-3處。

7.19.2 原因

循環索引最常出問題的地方就在循環點四周,將隊首放在這里可以很早就發現問題。

問題常出現在:插入元素使得下標從MAX-1繞回到0、刪除元素使得下標從0繞回到MAX-1、插入頭一兩個元素,以及刪除最后一兩個元素時。選擇MAX-3可以一口氣將這些情況都覆蓋住。

更改為

7.19.1 例子

假設循環隊列下標從0到MAX-1(MAX為該隊列可容納的元素個數),則隊首游標應設在MAX-3處。

7.19.2 原因

循環索引最常出問題的地方就在循環點四周,將隊首游標放在這里可以很早就發現問題。

問題常出現在:插入元素使得游標從MAX-1繞回到0、刪除元素使得游標從0繞回到MAX-1、插入頭一兩個元素,以及刪除最后一兩個元素時。選擇MAX-3可以一口氣將這些情況都覆蓋住。

正文p89

原則8.1 關于常量修飾符的含義

例子

char* p = “Hello.”; // 指針不是常量,指針指向的也不是常量

const char* p = “Hello.”; // 指針不是常量,指針指向的是常量

char* const p = “Hello.”; // 指針是常量,指針指向的不是常量

const char* const p = “Hello”; // 指針是常量,指針指向的也是常量

更改為

原則8.1 關于常量修飾符的含義

8.1.1 例子

char* p = “Hello.”; // 指針不是常量,指針指向的也不是常量

char const* p = “Hello.”; // 指針不是常量,指針指向的是常量

char* const p = “Hello.”; // 指針是常量,指針指向的不是常量

char const* const p = “Hello”; // 指針是常量,指針指向的也是常量

8.1.2 說明

“char* p”的意思是:p是一個指針;它指向字符類型。

“char const* p”的意思是:p是一個指針;它指向一個常量;該常量是字符類型。

“char* const p”的意思是:p是一個常量;它是一個指針常量;該常量指針指向字符類型。

“char const* const p”的意思是:p是一個常量;它是一個指針常量;該常量指針指向一個常量;而被指向的常量是字符類型。

正文p89~90

8.2.3 原因

編譯器會永遠記住此事。假如今后對blockCopy()的任何修改(有意或無意)要對pSrc所指數據進行寫操作,就會引起編譯錯誤,從而提示該函數的后繼開發者遵循最初的設計。

更改為

編譯器會永遠記住此事。假如今后對blockCopy()函數體的任何修改(有意或無意)要對pSrc所指數據進行寫操作,就會引起編譯錯誤,從而提示該函數的后繼開發者遵循最初的設計。

正文p92

8.5.2 原因

造成程序狀態改變的成員函數不是絕對意義上的常量成員函數(不符合大多數人對常量成員函數的預期)。

更改為

造成程序狀態改變的成員函數不是絕對意義上的常量成員函數。雖然不一定違反C++語法,但語義有問題,且不符合大多數人對常量成員函數的預期。



正文p123原則15.4 不要用分號結束宏定義

例子

/*

* 用分號結尾,結果導致下面第二條語句變成

* “channel=CHANNEL_MAX;-1;”,編譯出錯


*/

更改為

例子

/*----------------------------------------

* 用分號結尾,結果導致下面第二條語句變成

* “channel=16;-1;”,編譯出錯

-----------------------------------------*/

正文p128

15.11.2 原因

……

對于不得不出現在公共頭文件中的宏(如防止頭文件被多次引用的宏),要加前綴以減少沖突,參見“原則1.7 關于匿名命名空間級標識符的前綴”。

更改為

……

對于不得不出現在公共頭文件中的宏(如防止頭文件被多次引用的宏),要加前綴以減少沖突,參見“原則1.7 關于全局命名空間級標識符的前綴”。

正文p132原則16.7 非凡當心析構時發生異常

原因

C++的異常處理機制規定,若在異常處理期間又發生異常,程序將被終止。

更改為

C++的異常處理機制規定,若在異常處理期間(catch語句塊中)又發生異常,程序將被終止。

正文p142

17.15.2 例子

// {}單獨占一行,并且和if語句縮進相同

更改為

17.15.2 例子

// {}單獨占一行,并且和if/for語句縮進相同

正文p146原則17.20 為所有switch語句提供default分支

原因

……這樣,今后一旦增加新分支(比如枚舉增加了新的值),不必擔心是否會遺漏相關的switch語句。

更改為

原因

……這樣,今后一旦增加新分支(比如枚舉增加了新的值),不必擔心是否會遺漏相關的switch語句(遺漏會造成程序退出,馬上就能發現)。

正文p148

17.24.2 原因

編譯器在解析變量定義時是從右向左掃描的,編程者也要習慣這種方式。如上例所示,pName首先是一個指針,其次它要指向一個常量,第三這個常量是字符類型的。仔細品味這些修飾,你會發現它們是有優先順序的,優先級越高越要放在右面(緊挨變量名)。

更改為

17.24.2 原因

編譯器在解析變量定義時是以變量名為核心向外掃描的,編程者也要習慣這種方式。如上例所示,pName首先是一個指針,其次它要指向一個常量,第三這個常量是字符類型的。仔細品味這些修飾,你會發現它們是有優先順序的,優先級越高越要靠近變量名。(還可參考“原則8.1 關于常量修飾符的含義”)

正文p160

原則18.12 區分“戰略性”注釋和“戰術性”注釋

18.12.1 說明

注釋分“戰略性”和“戰術性”兩大類:

“戰略性”注釋用來說明一段代碼,因而要放在該段代碼之前。通常,此類注釋較長(超過一行),建議用/**/風格。

“戰術性”注釋用來說明一句代碼,通常放在該代碼之后(行末注釋)。建議用//風格。

更改為

原則18.12 區分段落注釋和單行注釋

18.12.1 說明

注釋分段落和單行兩大類:

段落注釋用來說明一段代碼,因而要放在該段代碼之前。通常,此類注釋較長(超過一行),建議用/**/風格。

單行注釋用來說明一句代碼,通常放在該代碼之后(行末注釋)。建議用//風格。

段落注釋用橫線上下框住(見例子或附錄的大段代碼),目的是一目了然地將代碼和注釋區分出來,這樣有利于代碼和注釋的閱讀。(單行注釋這樣做顯得累贅,請讀者自己權衡。)

正文p161原則18.15 減少不必要的單獨占一行的注釋

原因

……

類定義和函數前的注釋(戰略性)不會打斷代碼,因為它們在一個完整的邏輯段之外。由此也可以揣摩該原則進退的分寸。

更改為

原因

……

類定義和函數前的注釋(段落注釋)不會打斷代碼,因為它們在一個完整的邏輯段之外。由此也可以揣摩該原則進退的分寸。

正文p172

20.1.4 此類宏的命名方式

……

此類宏的前綴請參見“原則1.7 關于匿名命名空間級標識符的前綴”。

更改為

……

此類宏的前綴請參見“原則1.7 關于全局命名空間級標識符的前綴”。

正文p174原則20.7 將函數庫放在一個單獨的目錄下引用

20.7.1 例子

#include “MyLibrary/ZErrLog.hpp”

更改為

20.7.1 例子

#include “Z_Library/ZErrLog.hpp”

正文p208

24.15.1 說明

……

但有的編譯器會視滿足下述條件之一的類為非直傳類:


……

有虛基類。

更改為

24.15.1 說明

……

但有的編譯器會視滿足下述條件之一的類為非直傳類:

……

有抽象基類。



正文p213

25.1.2 原因

減少命名沖突:

具體說明,請參見“原則1.8 減少匿名命名空間級標識符”。

更改為

25.1.2 原因

減少命名沖突:

具體說明,請參見“原則1.8 減少全局命名空間級標識符”。

P220附錄

/*

* ConstrUCtor:

* Direct initialization.

*/

Z_SmartPtr_T(

POINTEE_T* pPointee,

Z_AbstractFactory_T<POINTEE_T>* pFactory=NULL(2)(3)

);

更改為

/*------------------------

* Constructor:

* Direct initialization.

-------------------------*/

eXPlicit Z_SmartPtr_T(

POINTEE_T* pPointee,

Z_AbstractFactory_T<POINTEE_T>* pFactory=NULL(2)(3)

);

p222附錄

// Program Notes: -Multi-thread safe = False:

// This is because these kind of classes is just like a

// dumb pointer which need to be protected outside.

更改為

// Program Notes: -Multi-thread safe = False:

// This is because this kind of classes is just like dumb

// pointers which need to be protected outside.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥宁县| 房产| 阿拉善右旗| 济源市| 临汾市| 镇原县| 抚宁县| 灵武市| 闸北区| 乐都县| 静安区| 湛江市| 北碚区| 韩城市| 集贤县| 木兰县| 桐庐县| 鹤壁市| 宣城市| 漳浦县| 崇文区| 阿瓦提县| 临潭县| 芒康县| 仁寿县| 扬州市| 高雄市| 兴安县| 扎鲁特旗| 大埔区| 浮山县| 广丰县| 庐江县| 天全县| 绥江县| 米脂县| 遂宁市| 铅山县| 五峰| 岳阳县| 滦南县|