高質(zhì)量C編程指南_第1頁
高質(zhì)量C編程指南_第2頁
高質(zhì)量C編程指南_第3頁
高質(zhì)量C編程指南_第4頁
高質(zhì)量C編程指南_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

you

rWj質(zhì)量C++/C編程指南

文件狀態(tài)文件標識:

[]草稿文件當前版本:1.0

[V]正式文件作者:林銳博上

1]更改正式文件完成日期:2001年7月24日

高步呈C1/C條程指南,VL0

版本歷史

版本/狀態(tài)作者參與者起止日期備注

V0.9林銳2001-7-1至林銳起草

草稿文件2001-7-18

V1.0林銳2001-7-18至朱洪海審查V0.9,

正式文件2001-7-24林稅修正草稿中的錯誤

200tPage2of3

高步呈C1/C條程指南,VL0

目錄

前言6

第1章文件結(jié)構(gòu)11

1.1版權和版本的聲明11

1.2頭文件的結(jié)構(gòu)12

1.3定義文件的結(jié)構(gòu)13

1.4頭文件的作用13

1.5目錄結(jié)構(gòu)14

第2章程序的版式15

2.1空行15

2.2代碼行16

2.3代碼行內(nèi)的空格17

2.4對齊18

2.5長行拆分19

2.6修飾符的位置19

2.7注釋20

2.8類的版式21

第3章命名規(guī)則22

3.1共性規(guī)則22

3.2簡單的WINDOWS應用程序命名規(guī)則23

3.3簡單的UNIX應用程序命名規(guī)則25

第4章表達式和基本語句26

4.1運算符的優(yōu)先級26

4.2復合表達式27

4.3IF語句27

4.4循環(huán)語句的效率29

4.5FOR語句的循環(huán)控制變量30

4.6SWITCH語句30

4.7GOTO語句31

第5章常量33

5.1為什么需要常5:33

5.2CONST與#DEFINE的比較33

5.3常量定義規(guī)則33

5.4類中的常見34

第6章函數(shù)設計36

2004.Page2of3

高步呈C1/C條程指南,VL0

6.1參數(shù)的規(guī)則36

6.2返回值的規(guī)則37

6.3困數(shù)內(nèi)部實現(xiàn)的規(guī)則39

6.4其它建議40

6.5使用斷言41

6.6引用與指針的比較42

第7章內(nèi)存管理44

7.1內(nèi)存分配方式44

7.2常見的內(nèi)存錯誤及其對策44

7.3指針與數(shù)組的對比45

74指針參數(shù)是如何傳遞內(nèi)存的?47

7.5FREE和DELETE把指針怎么啦?50

7.6動態(tài)內(nèi)存會被自動郡放嗎?50

7.7杜絕“野指針”51

7.8有了MALLOC/FREE為什么還要NEW/DELETE?52

7.9內(nèi)存耗盡怎么辦?53

7.10MALLOC/FREE的使用要點54

7.11NEW/DELETE的使用要點55

7.12一些心得體會56

第8章C++函數(shù)的高級特性57

8.1函數(shù)重載的概念57

8.2成員函數(shù)的重載、覆蓋與隱藏60

8.3蒙數(shù)的缺省值63

8.4運算符重載64

8.5函數(shù)內(nèi)聯(lián)65

8.6一些心得體會68

第9章類的構(gòu)造函數(shù)、析構(gòu)函數(shù)與賦值函數(shù)69

9.1構(gòu)造函數(shù)與析構(gòu)函數(shù)的起源69

9.2構(gòu)造函數(shù)的初始化表70

9.3構(gòu)造和析構(gòu)的次序72

9.4示例:類STRING的構(gòu)造函數(shù)與析構(gòu)函數(shù)72

9.5不要輕視拷貝構(gòu)造函數(shù)與賦值函數(shù)73

9.6示例:類STRING的拷貝構(gòu)造函數(shù)與賦值函數(shù)73

9.7偷懶的辦法處理拷貝構(gòu)造函數(shù)與賦值函數(shù)75

9.8如何在派生類中實現(xiàn)類的基本函數(shù)75

9.9一些心得體會77

第10章類的繼承與組合78

2004.Page2of3

高步呈C1/C條程指南,VL0

10.1繼承78

10.2組合80

第11章其它編程經(jīng)驗82

II」使用CONST提高函數(shù)的健壯性82

11.2提高程序的效率84

11.3一些有益的建議85

參考文獻87

附錄A:C++/C代碼審查表88

附錄B:C++/C試題93

附錄C:C++/C試題的答案與評分標準97

2004.Page2of3

高步呈C1/C條程指南,VL0

前S

軟件質(zhì)量是被大多數(shù)程序員掛在嘴上而不是放在心上的東西!

除了完全外行和真正的編程高手外,初讀本書,你最先的感受將是驚慌:“哇!我以

前捏造的C++/C程序怎么會有那么多的毛???”

別難過,作者只不過比你早幾年、多幾次驚慌而已。

請花一兩個小時認真閱讀這本百頁經(jīng)書,你將會獲益匪淺,這是前面NT個讀者的

建議。

一、編程老手與高手的誤區(qū)

自從計算機問世以來,程序設計就成了令人羨慕的職業(yè),程序員在受人寵愛之后容

易發(fā)展成為毛病特多卻常能自我臭美的群體。

如今在Intern”上流傳的“真正”的程序員據(jù)說是這樣的:

(1)真正的程序員沒有進度表,只有討好領導的馬屁精才有進度表,真正的程序員會讓

領導提心吊膽。

(2)真正的程序員不寫使用說明書,用戶應當自己去猜想程序的功能。

(3)真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當然也很難讀。

(4)真正的程序員不畫流程圖,原始人和文盲才會干這事。

(5)真正的程序員不看參考手冊,新手和膽小鬼才會看。

(6)真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。

(7)真正的程序員認為自己比用戶更明白用戶需要什么。

(8)真正的程序員不接受團隊開發(fā)的理念,除非他自己是頭頭。

(9)真正的程序員的程序不會在笫一次就正確運行,但是他們愿意守著機器進行若干個

30小時的調(diào)試改錯。

(10)真正的程序員不會在上午9:00到下午5:00之間工作,如果你看到他在上午9:00工

作.這表明他從昨晚一育干至I]現(xiàn)存.

具備上述特征越多,越顯得水平高,資格老。所以別奇怪,程序員的很多缺點竟然

可以被當作優(yōu)點來欣賞。就象在武俠小說中,那些獨來獨往、不受約束且?guī)c邪氣的高

手最令人崇拜。我曾經(jīng)也這樣信奉,并且希望自己成為那樣的“真正”的程序員,結(jié)果

沒有得到好下場。

我從讀大學到博士畢業(yè)十年來一直勤奮好學,累計編寫了數(shù)十萬行C++/C代碼。有

這樣的苦勞和疲勞,我應該稱得上是編程老手了吧?

我開發(fā)的軟件都與科研相關(集成電路CAD和3D圖形學領域),動輒數(shù)萬行程序,

技術復雜,難度頗高。這些軟件頻頻獲獎,有一個軟件獲得首屆中國大學生電腦大賽軟

2004.Page2of3

高步呈C1/C條程指南,VL0

件展示一等獎。在1995年開發(fā)的一套圖形軟件庫到2000年還有人買。羅列出這些“業(yè)

績”,可以說明我算得上是編程高手了吧?

可惜這種個人感覺不等于事實。

讀博期間我曾用一年時間開發(fā)了一個近10萬行C++代碼的3D圖形軟件產(chǎn)品,我內(nèi)

心得意表面謙虛地向一位真正的軟件底i手請教.他雖然從未涉足過3D圖形領域,卻在

幾十分鐘內(nèi)指出該軟件多處重大設計錯誤。讓人感覺那套軟件是用紙糊的華麗衣服,扯

一下掉一塊,戳一下破個洞。我目瞪口呆地意識到這套軟件亳無實用價值,一年的心血

白化了,并且害死了自己的軟件公司。

人的頓悟通常發(fā)生在最心痛的時刻,在沮奏和心痛之后,我作了深刻反省,“面壁”

半年,重新溫習軟件設計的基礎知識。補修“內(nèi)功”之后,又覺得腰板硬了起來。博士

畢業(yè)前半年,我曾到微軟中國研究院找工作,接受微軟公司一位資深軟件工程師的面試。

他讓我寫函數(shù)strcpy的代碼。

太容易了吧?

錯!

這么一個小不點的函數(shù),他從三個方面考查:

<1)編程風格;

(2)出錯處理:

<3)算法復雜度分析(用于提高性能)。

在大學里從來沒有人如此嚴格地考查過我的程序。我化了半個小時,修改了數(shù)次,

他還不盡滿意,讓我回家好好琢磨。我精神抖擻地進“考場”,大汗淋漓地出“考場”。

這“高手”當?shù)靡蔡C囊了。我又好好地反省了一次。

我把反省后的心得體會寫成文章放在網(wǎng)上傳閱,引起了不少軟件開發(fā)人員的共鳴。

我因此有幸和國產(chǎn)大型IT企業(yè)如華為、上海貝爾、中興等公司的同志們廣泛交流。大家

認為提高質(zhì)量與生產(chǎn)率是軟件工程要解決的核心問題。高質(zhì)量程序設計是非常重要的環(huán)

節(jié),畢竟軟件是旅編程來實現(xiàn)的。

我們心目中的老手們和高手們能否編寫出鬲質(zhì)量的程序來?

不見得都能!

就我的經(jīng)歷與閱歷來看,國內(nèi)大學的計算機教育壓根就沒有灌輸高質(zhì)量程序設計的

觀念,教師們和學生們也很少自覺關心軟件的質(zhì)量。勤奮好學的程序員長期在低質(zhì)量的

程序堆中滾爬,吃盡苦頭之后才有一些心得體會,長進極慢,我就是一例。

現(xiàn)在國內(nèi)IT企業(yè)擁有學士、碩士、博士文憑的軟件開發(fā)人員比比皆是,但他們在接

受大學教育時就“先天不足”,豈能一到企業(yè)就突然實現(xiàn)質(zhì)的飛躍。試問有多少軟件開發(fā)

人員對正確性、健壯性、可靠性、效率、易用怛、可讀性(可理解性)、可擴展性、可凝

用性、兼容性、可移植性等質(zhì)量屬性了如指掌?并且能在實踐中運用自如?。“高質(zhì)量”

可不是干活小心點就能實現(xiàn)的!

2004.Page2of3

高步呈C1/C條程指南,VL0

我們有充分的理由疑慮:

(1)編程老手可能會長期用品含錯誤的方式編程(習慣成自然),發(fā)現(xiàn)毛病后都不愿相

信那是真的!

(2)編程高手可以在某一領域?qū)懗鰳O有水平的代碼,但未必能從全同把握軟件質(zhì)量的方

方面面。

事實證明如此。我到上海貝爾工作?年來,陸續(xù)面試或測試過近百名“新”“老”程

序員的編程技能,質(zhì)量合格率大約是10%。很少有人能夠?qū)懗鐾耆腺|(zhì)量要求的if

語句,很多程序員對指針、內(nèi)存管理一知半解

領導們不敢相信這是真的。我做過現(xiàn)場試驗:有一次部門新進14名碩士生,在開歡

迎會之前對他們進行“C++/C編程技能”摸底考試。我問大家試題難不難?所有的人都

回答不難。結(jié)果沒有一個人及格,有半數(shù)人得零分。競爭對手公司的朋友們也做過試驗,

同樣一敗涂地。

真的不是我“心狠手辣”或者要求過高,而是很多軟件開發(fā)人員對自己的要求不夠

高。

要知道華為、上海貝爾、中興等公司的員工索質(zhì)在國內(nèi)IT企業(yè)中是比較前列的,倘

若他們的編程質(zhì)量都如此差的話,我們怎么敢期望中小公司拿出高偵量的軟件呢?連程

序都編不好,還談什么振興民族軟件產(chǎn)業(yè),豈不胡扯。

我打算定義編程老手和編程高手,請您別見笑。

定義1:能長期穩(wěn)定地編寫出高質(zhì)量程序的程序員稱為編程老手。

定義2:能長期穩(wěn)定地編寫出高難度、高質(zhì)量程序的程序員稱為編程高手。

根據(jù)上述定義,馬上得到第一推論:我既K是高手也算不上是老手。

在寫此書前,我閱讀了不少程序設計方面的英文著作,越看越差慚。因為發(fā)現(xiàn)自己

連編程基本技能都未能全面掌握,頂多算是二流水平,還好意思談什么老手和高手。希

望和我一樣在國內(nèi)土生土長的程序員朋友們能夠做到:

(1)知錯就改:

(2)經(jīng)常溫故而知新;

(3)堅持學習,天天向上。

2004.Page2of3

高步呈C1/C條程指南,VL0

二、本書導讀

首先請做附錄B的C++/C試題(不要看答案),考查自己的編程質(zhì)量究竟如何。然后

參照答案嚴格打分。

(1)如果你只得了幾十分,請不要聲張,也不要太難過。編程殖量差往往是由于不良習

慣造成的,與人的智力、能力沒有多大關系,還是有藥可救的。成績越差,可以進步的

空間就越大,中國不就是在落后中趕超發(fā)達資本主義國家嗎?只要你能下決心改掉不良

的編程習慣,第二次考試就能及格了。

(2)如果你考及格了,表明你的技術基礎不錯,希望你能虛心學習、不斷進步。如果你

還沒有找到合適的工作單位,不妨到上海貝爾試一試。

(3)如果你考出85分以上的好成績,你有義務和資格為你所在的團隊作“C++/C編程”

培訓。希望你能和我們多多交流、相互促進。半年前我曾經(jīng)發(fā)現(xiàn)一顆好苗子,就把他挖

到我們小組來。

(4)如果你在沒有任何提示的情況下考了滿分,希望你能收我做你的徒弟。

編程考試結(jié)束后,請閱讀本書的正文。

本書第一章至第六章主要論述C++/C編程風格。難度不高,但是細節(jié)比較多。別小

看了,提高質(zhì)量就是要從這些點點滴滴做起。世上不存在最好的編程風格,一切因需求

而定。團隊開發(fā)講究風格一致,如果制定了大家認可的編程風格,那么所有組員都要遵

守。如果讀者覺得本書的編程風格比較合你的工作,那么就采用它,不要只看不做。人

在小時候說話發(fā)音不準,寫字潦草,如果不改正,總有后悔的時候。編程也是同樣道理。

第七章至第十一章是專題論述,技術難度比較高,看書時要積極思考。特別是第七

章“內(nèi)存管理”,讀了并不表示懂r,懂r并不表示就能正確使用.有一位同事看了第七

章后覺得“野指針”寫得不錯,與我切磋了一把??墒沁^了兩周,他告訴我,他忙了兩

天追查出一個Bug,想不到又是“野指針”出問題,只好重讀第七章。

光看本書對提高編程質(zhì)量是有限的,建議大家閱讀本書的參考文獻,那些都是經(jīng)典

名著。

如果你的編程質(zhì)量已經(jīng)過關了,不要就此滿足。如果你想成為優(yōu)秀的軟件開發(fā)人員,

建議你閱讀并按照CMMI規(guī)范做事,讓自己的綜合水平上升?個臺階。上海貝爾的員工

可以向網(wǎng)絡應用事業(yè)部軟件工程研究小組索取CMMI有關資料,最好能參加培訓。

2004.Page2of3

高步呈C1/C條程指南,VL0

三、版權聲明

本書的大部分內(nèi)容取材于作者一年前的班籍手稿(尚未出版),現(xiàn)整理匯編成為上海

貝爾網(wǎng)絡應用事業(yè)部的一個規(guī)范化文件,同時作為培訓教材。

由于C++/C編程是眾所周知的技術,沒有堪密可言。編程的好經(jīng)驗應該大家共享,

我們自己也是這么學來的。作者愿意公開本書的電子文檔。

版權聲明如下:

(1)讀者可以任意拷貝、修改本書的內(nèi)容,但不可以套改作者及所屬單位。

(2)未經(jīng)作者許可,不得出版或大量印發(fā)本書。

(3)如果競爭對手公司的員工得到本書,請勿公開使用,以免發(fā)生糾紛。

預計到2002年7月,我們將建立切合中國國情的CMMI3級解決方案。屆時,包括

本書在內(nèi)的約1000頁規(guī)范將嚴格受控。

歡迎讀者對本書提出批評建議。

林銳,2001年7月

2004.Page2of3

高步呈C1/C條程指南,VL0

第1章文件結(jié)構(gòu)

每個C++/C程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration),

稱為頭文件。另一個文件用于保存程序的實現(xiàn)(implementation),稱為定義(definition)

文件。

C++/C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴,C++程序

的定義文件通常以,cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。

1.1版權和版本的聲明

版權和版本的聲明位于頭文件和定義文件的開頭(參見示例1-1),主要內(nèi)容有:

版權信息.

(2)文件名稱,標識符,摘要。

(3)當前版本號,作者/修改者,完成口期。

(4)版本歷史信息。

/*

?Copyright(c)2001,上海貝爾有限公司網(wǎng)絡應用事業(yè)部

?Allrightsreserved.

*

*文件名稱:fi1ename.h

*文件標識:見就置管理計劃書

,摘要:簡要描述本文件的內(nèi)容

*當前版本:1.1

*作者:諭入作者(或修改者)名字

*完成H期:2001維7月20日

*

*取代版本:1.0

*原作者:輸入原作者(或修改者)名字

*完成口期:2001年5月10口

示例】T版權和版本的聲明

2004.Page2of3

與質(zhì)鼠Cj/C新程指南,vLO

1.2頭文件的結(jié)構(gòu)

頭文件由三部分內(nèi)容組成:

(1)頭文件開頭處的版權和版本聲明(參見示例1-1)。

(2)預處理塊。

(3)函數(shù)和類結(jié)構(gòu)聲明等。

假設頭文件名稱為graphics,h,頭文件的結(jié)構(gòu)參見示例1-2。

?【規(guī)則1-2-1】為了防止頭文件被重品引用,應當用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預處

理塊。

?[規(guī)則1?2?2】用^include<filcnamc.h>格式來引用標準庫的頭文件(編譯器將從

標準庫目錄開始搜索)。

?【規(guī)則1-2-3】用^include-filciiiiinc.il-格式來引用非標準庫的頭文件(編譯器將

從用戶的工作目錄開始搜索

?【建議1-2-1]頭文件中只存放“聲明”而不存放“定義”

在C++語法中,類的成員函數(shù)可以在聲明的同時被定義,并且自動成為內(nèi)聯(lián)函數(shù)。

這雖然會帶來書寫上的方便,但卻造成了風格不一致,弊大于利。建議將成員函數(shù)的定

義與聲明分開,不論該函數(shù)體有多么小。

令【建議1-2?2】不提倡使用全局變量,盡量不要在頭文件中出現(xiàn)象exierninivalue這

類聲明。

//版權和版本聲明見示例1-1.此處省略。

#ifndefGRAPHICSHU防止graphics.h被重復引用

忖efineGRAPHICS_H

#include<math.h>〃引用標準庫的頭文件

*include"myhcadcr.h”〃引用非標準庫的頭文件

voidFunctionl(?,,);//全局函數(shù)聲明

classBox//類結(jié)構(gòu)聲明

):

Sendif

示例I2C++/C頭文件的結(jié)構(gòu)

2001Page2of3

:12A.',J'Kt'I.LJT'T丁】▼?B?u

1.3定義文件的結(jié)構(gòu)

定義文件存三部分內(nèi)容:

(1)定義文件開頭處的版權和版本聲明(參見示例1-1)。

(2)對一些頭文件的引用。

(3)程序的實現(xiàn)體(包括數(shù)據(jù)和代碼)。

假設定義文件的名稱為graphics,cpp,定義文件的結(jié)構(gòu)參見示例1-3。

//版權和版本聲明見示例1-1,此處省略。

^include''graphics.h"〃引用頭文件

//全局函數(shù)的實現(xiàn)體

▼oidFunction!(???)

I

}

//類成員函數(shù)的實現(xiàn)體

voidBox::Draw(…)

示例1-3C++/C定義文件的結(jié)構(gòu)

1.4頭文件的作用

早期的編程語言如Basic、Fortran沒有頭文件的概念,C++/C語言的初學者雖然會

用使用頭文件,但常常不明其理。這里對頭文件的作用略作解釋:

(1)通過頭文件來調(diào)用庫功能。在很多場合,源代碼不便(或不準)向用戶公布,只要

向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功

能,而不必關心接口怎么實現(xiàn)的。編譯器會從庫中提取相應的代碼。

(2)頭文件能加強類型安全檢查。如果某個接口被實現(xiàn)或被使用時,其方式與頭文件中

的聲明不一致,編譯器就會指出錯誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯的

負擔。

高步呈C1/C條程指南,VL0

1.5目錄結(jié)構(gòu)

如果一個軟件的頭文件數(shù)目比較多(如超過十個),通常應將頭文件和定義文件分別

保存于不同的目錄,以便于維護。

例如可將頭文件保存于include目錄,將定義文件保存于source目錄(可以是多級

目錄)。

如果某些頭文件是私有的,它不會被用戶的程序直接引用,則沒有必要公開其“聲

明”.為了加強信息隱藏,這些私有的頭文件可以和定義文件存放于同一個目錄。

2004.Page2of3

高步呈C1/C條程指南,VL0

第2章程序的版式

版式雖然不會影響程序的功能,但會影響可讀性。程序的版式追求清晰、美觀,是

程序風格的重要構(gòu)成因素。

可以把程序的版式比喻為“書法"。好的''書法”可讓人對程序一目了然,看得興致

勃勃。差的程序“書法”如螃蟹爬行,讓人看得索然無味,更令維護者煩惱有加。請程

序員們學習程序的“書法”,彌補大學計算機教育的漏洞,實在很有必要。

2.1空行

空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布局更加

清晰.空行不會浪贄內(nèi)存,雖然打印含有空行的程序是會多消耗一些紙張,但是值得.

所以不要舍不得用空行。

?【規(guī)則2-1-1]在每個類聲明之后、每個函數(shù)定義結(jié)束之后都要加空行。參見示例

2-1(a)

?【規(guī)則2-1-2]在一個函數(shù)體內(nèi),邏揖上密叨相關的語句之間不加空行,其它地方應

加空行分隔。參見示例2/(b)

//空行//空行

voidFunctionl(??,)while(condition)

I(

statementl;

]//空行

:/空行if(condition)

voidFunction2(—){

Istatement2;

}

)else

//空行(

voidFunction3(…)statements;

I)

//空行

)statements;

}

示例2-l(a)函數(shù)之間的空行示例27(b)函數(shù)內(nèi)部的空行

2004.Page2of3

高步呈C1/C條程指南,VL0

2.2代碼行

?【規(guī)則2-2-1)一行代碼只做一件事情,如只定義一個變質(zhì),或只寫一條語句。這樣

的代碼容易閱讀,并旦方便于寫注釋。

?【規(guī)則2.2.2]if、for.while,do等語句自占一行,執(zhí)行語句不得緊跟其后。不論

執(zhí)行語句有多少都要加{卜這樣可以防止書寫失誤。

示例2-2(a)為風格良好的代碼行,示例2-2(b)為風格不良的代碼行。

intwidth;//寬度intwidth,height,depth://寬度高度深度

intheight;//高度

intdepth://深度

x=a+b;X=a+b;y=c+d;z=e*f;

y=c+d:

z=e+f;

if(width<height)if(width<height)dosomethingO;

{

dosomethingO;

}

for(initialization:condition;update)for(initialization:condition:update)

(dosomethingO;

dosomethingO;other():

}

//交行

other();

示例2-2(a)風格良好的代碼行示例2-200風格不良的代碼行

?【建議2?2?1】盡可能在定義變量的同時初始化該變量(就近原則)

如果變量的引用處和其定義處相隔比較遠,變量的初始化很容易被忘記。如果引用

了未被初始化的變量,可能會導致程序錯誤。本建議可以減少隱患。例如

intwidth=10://定義并初紿化width

intheight=10://定義并初紿化height

intdepth=10;//定義并初紿化depth

2004.Page2of3

高步呈C1/C條程指南,VL0

2.3代碼行內(nèi)的空格

?【規(guī)則2-3-1]關鍵字之后要留空格。象const、virtual、inline*case等關鍵字之后

至少要留一個空格,否則無法辨析關鍵字。象if、for、while等關鍵字之后應留一個

空格再跟左括號'(',以突出關鍵字。

?【規(guī)則2?3.2】函數(shù)名之后不要留空格,緊跟左括號'(',以與關鍵字區(qū)別。

?【規(guī)則2?3?3】'('向后緊跟,向前緊跟,緊跟處不留空格。

?【規(guī)則2-3-4】‘,'之后要留空格,如Functionsy,z)。如果不是一行的結(jié)束

符號,其后要留空格,如for(initialization;condition;update).

?【規(guī)則24.5]賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符,

如“="、“+=”“>="、“<="、"+”、“辛”、,“人”等二元

操作符的前后應當加空格。

?【規(guī)則2-3-6】元操作符如“!”、“~”、“-+”、“一”、“&”(地垃運算符》等前后不

加空格。

?【規(guī)則2-3-7]象這類操作符前后不加空格。

0【建議2?3?1】對于表達式比較長的for語句和if語句,為了緊湊起見可以適當?shù)厝?/p>

掉一些空格,如for(i=0;i<10;i++)fl]if((a<=b)&&(c<=d?

voidFund(intx,inty,intz);//良好的風格

voidFund(intx,inty,intz)://不良的風格

if(year>=2000)//良好的風格

if:year>=2000)//不良的風格

if((a>=b)&&(c<=d))//良好的風格

if:a>=b&&c<=d)//不良的風格

for(i=0;i<10:i++)//良好的風格

for(i=0;i<10;i++)//不良的風格

for(i=0;I<10;i++)//過多的空格

x=a<b?a:b;//良好的風格

x-u<b?a.b.//不好的風格

int*x=&y;//良好的風格

int?x=&y;//不良的風格

array[5]=0;//不要寫成array[5]=0;

a.FunctionO;//不要寫成a.FunctionO:

b->Function0;//不要寫成b->FunctionO:

示例2-3代碼行內(nèi)的空格

2004.Page2of3

高步呈C1/C條程指南,VL0

2.4對齊

?【規(guī)則2-4-1】程序的分界符'{‘和'}'應獨占一行并且位于同一列,同時與引用

它們的語句左對齊。

?【規(guī)則2.4.2]{}之內(nèi)的代碼塊在'{'右邊數(shù)格處左對齊。

示例24(a)為風格良好的對齊,示例2.4(b)為風格不良的對齊。

voidFunction(intx)voidFunction(intx){

(???//programcode

//programcodeI

)

if(condition)if(condition){

{…//programcode

―//programcode}

)else{

else???//programcode

{l

―//programcode

}

for(initialization;condition;update)for(initialization;condition;update)(

…//programcode

―//programcode}

}

While(condition)while(condition){

!…//programcode

―//programcode}

}

如只出現(xiàn)嵌套的(},則使用縮進對齊,如:

(

(

)

1

示例2-4(a)風格良好的對齊示例27(b)風格不良的對齊

200tPage2of3

高步呈C1/C條程指南,VL0

2.5長行拆分

?【規(guī)則2-5-1】代碼行最大長度宜控制在7。至80個字符以內(nèi)。代碼行不要過長,否

則眼睛看不過來,也不便于打印。

?【規(guī)則2?5.2】長表達式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以

便突出操作符)。拆分出的新行要進行適當?shù)目s進,使排版整齊,語句可讀。

if((very_longer_variablel>=very_longer_variablel2)

&&(very1onger_variab1e3<=very1onger_variab1c14)

&&(very1onger_variab1e5<=very1onger_variab1e16))

I

dosomethingO:

}

virtualCMatrixCMultiplyMatrix(CMatrixleftMatrix,

CMatrixrightMatrix):

for(very_longerinitialization;

very1onger_condition;

very_longer_update)

(

dosomethingO;

}

示例2-5長行的拆分

2.6修飾符的位置

修飾符*和&應該靠近數(shù)據(jù)類型還是該靠近變量名,是個有爭議的話題。

若將修飾符*靠近數(shù)據(jù)類型,例如:int*x;從語義上講此寫法比較直觀,即x

是int類型的指針。

上述寫法的弊端是容易引起誤解,例如:ini*x,y;此處y容易被誤解為指針變

信。雖然將x和y分行定義可以避免誤解,但并不是人人都愿意這樣做。

?【規(guī)則2-6-1】應當將修飾符?和&緊靠變命名

例如:

char*name;

int*x.y://此處y不會被誤解為指針

2004.Page2of3

高步呈C1/C條程指南,VL0

2.7注釋

c語言的注釋符為“蘆C++語言中,程序塊的注釋常采用“蘆行注釋

一般采用注釋通常用于:

(1)版本、版權聲明:

(2)函數(shù)接口說明:

(3)重要的代碼行或段落提示。

雖然注釋有助于理解代碼,但注意不可過多地使用注釋。參見示例2-6。

?【規(guī)則2-7-1]注釋是對代碼的“提示”,而不是文檔。程序中的注釋不可喧賓奪主,

注釋太多了會讓人眼花壕亂。注釋的花樣要少。

?【規(guī)則2?7-2】如果代碼本來就是清楚的,則不必加注釋。否則多此一舉,令人厭煩。

例如

i++;//i加1,多余的注釋

?【規(guī)則2?7.3】邊寫代碼邊注稱,修改代碼同時修改相應的注糅,以保證注釋與代碼

的一致性。不再有用的注釋要刪除。

?【規(guī)則2-7-4】注釋應當準確、易臨,防止注釋有二義性。錯誤的注釋不但無益反而

有害。

?【規(guī)則2-7-5]盡量避免在注釋中使用縮寫,特別是不常用縮寫。

?【規(guī)則2?7.6】注釋的位置應與被描述的代眄相鄰,可以放在代碼的上方或右方,不

可放在下方。

?【規(guī)則2-7-8】當代碼比較長,特別是奇■多重嵌套時,應當在一些段落的結(jié)束處加注

釋,便于閱讀。

/?if(…)

*函數(shù)介紹:{

*輸入?yún)?shù):

*輸出參數(shù):while(...)

*返回值:(

*/

voidFunction(Floatx,floaty,floatz)}//endofwhile

t

)'!endofif

)

示例2-6程序的注擇

2004.Page2of3

高步呈C1/C條程指南,VL0

2.8類的版式

類可以將數(shù)據(jù)和函數(shù)封裝在一起,其中函數(shù)表示了類的行為(或稱服務)。類提供關

鍵字public、proiecied和private,分別用于聲用哪些數(shù)據(jù)和函數(shù)是公有的、受保護的或

者是私有的。這樣可以達到信息隱藏的目的,即讓類僅僅公開必須要讓外界知道的內(nèi)容,

而隱藏其它一切內(nèi)容。我們不可以濫用類的封裝功能,不要把它當成火鍋,什么東西都

往里扔。

類的版式主要有兩種方式:

(1)將private類型的數(shù)據(jù)寫在前面,而將public類型的函數(shù)寫在后面,如示例8-3(a).

采用這種版式的程序員主張類的設計“以數(shù)據(jù)為中心”,重點關注類的內(nèi)部結(jié)構(gòu)。

(2)將public類型的函數(shù)寫在前面,而將private類型的數(shù)據(jù)寫在后面,如示例8.3(b)

采用這種版式的程序員主張類的設計“以行為為中心”,重點關注的是類應該提供什么樣

的接口(或服務)。

很多C++教課書受到BiarneStroustrup第一本著作的影響,不知不覺地采用了“以

數(shù)據(jù)為中心”的書寫方式,并不見得有多少道理。

我建議讀者采用“以行為為中心”的書寫方式,即首先考慮類應該提供什么樣的函

數(shù)。這是很多人的經(jīng)驗一一“這樣做不僅讓自己在設計類時思路清晰,而且方便別人閱

讀。因為用戶最關心的是接口,誰愿意先看到一堆私有數(shù)據(jù)成員!”

classAclassA

{(

private:public:

inti,j;voidFund(void);

floatx,y;voidFunc2(void);

public:private:

voidFund(void):inti,j;

voidFunc2(void);floatx,y:

)}

示例8.3(a)以數(shù)據(jù)為中心版式示例8.3(b)以行為為中心的版式

2004.Page2of3

高步呈C1/C條程指南,VL0

第3章命名規(guī)則

比較著名的命名規(guī)則當推Microsofl公司的“匈牙利”法,該命名規(guī)則的主要思想是

“在變量和函數(shù)名中加入前綴以增進人們對程序的理解”。例如所有的字符變殳均以ch

為前綴,若是指針變量則追加前綴P。如果一個變量由ppch開頭,則表明它是指向字符

指針的指針。

“匈牙利”法最大的缺點是煩瑣,例如

inti,j,k:

floatx,y,z;

倘若采用“匈牙利”命名規(guī)則,則應當寫成

intil,ij,ik;//前綴i表示int類型

floatfX,fY,fZ;//前綴f表示float類型

如此煩瑣的程序會讓絕大多數(shù)程序員無法忍受,

據(jù)考察,沒有一種命名規(guī)則可以讓所有的程序員貸同,程序設計教科書一般都不指

定命名規(guī)則。命名規(guī)則對軟件產(chǎn)品而言并不是“成敗悠關”的事,我們不要化太多精力

試圖發(fā)明世界上最好的命名規(guī)則,而應當制定一種令大多數(shù)項目成員滿意的命名規(guī)則,

并在項目中貫徹實施。

3.1共性規(guī)則

本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應當在遵循這些共性規(guī)則的前

提下,再擴充特定的規(guī)則,如3.2節(jié)。

?【規(guī)則標識符應當直觀且可以拼讀,可望文知意,不必進行“解碼”。

標識符最好采用英文單詞或其組合,便了記憶和閱讀。切忌使用漢語拼音來命名。

程序中的英文單詞一般不會太貪雜,用詞應當準確。例如不要把CurrentValuc寫成

NowValues

?【規(guī)則3-1-2】標識符的長度應當符合"min-length&&max-information”原則。

幾十年前老ANSIC規(guī)定名字不準超過6個字符,現(xiàn)今的C++/C不再有此限制。一

般來說,長名字能更好地表達含義,所以函數(shù)名、變量名、類名長達十幾個字符不足為

怪。那么名字是否越氏約好?不見得!例如變量名maxval就比maxYalueUntilOver門ow

好用.單字符的名字也是布?用的,常見的如它們通??捎米骱瘮?shù)

內(nèi)的局部變量。

?【規(guī)則3-1-3]命名規(guī)則盡量與所采用的操作系統(tǒng)或開發(fā)工具的風格保持一致。

例如Windows應用程序的標識符通常采用“大小寫”混排的方式,如AddChikL而

Unix應用程序的標識符通常采用“小寫加卜劃線”的方式,如add_child..別把這兩類風

2004"Page2of3

高步呈C1/C條程指南,VL0

格混在一起用。

?【規(guī)則3-1-4]程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符。

例如:

intX,X;〃變量x與X容易混淆

voidfoo(intx);//函數(shù)foo與F00容易混清

voidFOO(floatx);

?【規(guī)則315]程序中不要出現(xiàn)標識符完全相同的局部變量和全局變量,盡管兩者的

作用域不同而不會發(fā)生語法錯誤,但會使人誤解。

?【規(guī)則3-1-6]變量的名字應當使用“名詞”或者“形容詞十名詞”。

例如:

floatvalue;

floatoldValuc;

floatncwValuc;

?【規(guī)則3-1-7]全員函數(shù)的名字應當使用“動詞”或者“動詞+名詞”(動賓詞組)。

類的成員函數(shù)應當只使用“動詞”,被省略掉的

溫馨提示

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

評論

0/150

提交評論