軟件開發(fā)流程規(guī)范-詳細(xì)流程_第1頁
軟件開發(fā)流程規(guī)范-詳細(xì)流程_第2頁
軟件開發(fā)流程規(guī)范-詳細(xì)流程_第3頁
軟件開發(fā)流程規(guī)范-詳細(xì)流程_第4頁
軟件開發(fā)流程規(guī)范-詳細(xì)流程_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

軟件開發(fā)流程規(guī)范目錄目錄 一、概述本文制定煙臺(tái)開發(fā)區(qū)德聯(lián)軟件有限責(zé)任公司計(jì)算機(jī)軟件開發(fā)規(guī)范文檔。本規(guī)范的目的是使公司軟件開發(fā)項(xiàng)目階段清晰、要求明確、任務(wù)具體、編寫的代碼規(guī)范,使之規(guī)范化、系統(tǒng)化和工程化,向公司內(nèi)從事軟件開發(fā)的工程師和管理人員提出一系列規(guī)范和要求,從而有利于開發(fā)過程的控制和管理,提高所開發(fā)軟件系統(tǒng)的質(zhì)量,縮短開發(fā)時(shí)間,減少開發(fā)和維護(hù)費(fèi)用,以保證項(xiàng)目高質(zhì)量、順利進(jìn)行。本規(guī)范包含:開發(fā)流程規(guī)范和開發(fā)代碼規(guī)范等,開發(fā)流程規(guī)范需要技術(shù)開發(fā)人員編寫相關(guān)內(nèi)容,希望每個(gè)技術(shù)人員形成習(xí)慣,如有新的內(nèi)容更新會(huì)及時(shí)通知大家,如有好的規(guī)范要求也可通知編制人員及時(shí)更新。本規(guī)范為煙臺(tái)開發(fā)區(qū)德聯(lián)軟件有限責(zé)任公司內(nèi)部材料,嚴(yán)禁其他商業(yè)應(yīng)用。二、開發(fā)流程規(guī)范 接受開發(fā)任務(wù),詳細(xì)閱讀軟件技術(shù)規(guī)范或技術(shù)文檔,如對(duì)技術(shù)文檔有疑義或者不清楚的地方及時(shí)與項(xiàng)目總工或用戶溝通,根據(jù)文檔和溝通內(nèi)容編寫項(xiàng)目開發(fā)計(jì)劃,必須包括但不限于系統(tǒng)軟硬件開發(fā)環(huán)境、系統(tǒng)架構(gòu)、系統(tǒng)功能模塊設(shè)計(jì)、系統(tǒng)功能開發(fā)流程圖、開發(fā)修改記錄。2.1系統(tǒng)軟硬件開發(fā)環(huán)境開發(fā)環(huán)境的搭建,最好形成文檔,便于以后同樣工作的使用。開發(fā)人員要明確系統(tǒng)開發(fā)擬采用的數(shù)據(jù)庫、操作系統(tǒng)、開發(fā)語言、開發(fā)工具、服務(wù)器等(具體到版本)。明確整個(gè)系統(tǒng)開發(fā)工作流程,至少應(yīng)該包括以下流程。2.2系統(tǒng)架構(gòu)(系統(tǒng)組成)確定系統(tǒng)整體體系架構(gòu),各層次之間的數(shù)據(jù)流的連接,確定軟件服務(wù)器的硬件配置及用戶硬件資源配置,確定與用戶軟件平臺(tái)的統(tǒng)一協(xié)調(diào)。開發(fā)人員在繪制架構(gòu)圖時(shí)給出基本框架,能反映出基本意義即可,可以直接用文字代替例子中的圖片。圖1系統(tǒng)邏輯架構(gòu)圖舉例圖2物理架構(gòu)圖舉例2.3系統(tǒng)功能模塊設(shè)計(jì)給出系統(tǒng)的主要功能模塊,每個(gè)模塊所包含的功能。圖3圖書管理系統(tǒng)模塊規(guī)劃圖舉例2.4系統(tǒng)功能開發(fā)流程圖給出系統(tǒng)主要功能的業(yè)務(wù)流程圖。圖4系統(tǒng)功能業(yè)務(wù)流程圖舉例2.5開發(fā)修改記錄1.開發(fā)代碼做好備份(可以在完成一個(gè)重大功能之后,或者按時(shí)間周期性進(jìn)行備份),以免由于不可抗力導(dǎo)致代碼不可修復(fù)。2.在每次重大修改之后要做好記錄(改動(dòng)的具體細(xì)節(jié)),修改前的版本要及時(shí)備份,可以方面隨時(shí)還原系統(tǒng)。修改日期修改內(nèi)容是否備份備注

三、開發(fā)代碼規(guī)范 在研究項(xiàng)目團(tuán)隊(duì)協(xié)作開發(fā)的情況下(這里的團(tuán)隊(duì)協(xié)作也適合于應(yīng)用項(xiàng)目的開發(fā)),編程時(shí)應(yīng)該強(qiáng)調(diào)的一個(gè)重要方面是程序的易讀性,在保證軟件速度等性能指標(biāo)能滿足用戶需求的情況下,能讓其他程序員容易讀懂你所編寫的程序。若研究項(xiàng)目小組的所有開發(fā)人員都遵循統(tǒng)一的、鮮明的一套編程風(fēng)格,可以讓協(xié)作者、后繼者和自己一目了然,在很短的時(shí)間內(nèi)看清楚程序結(jié)構(gòu),理解設(shè)計(jì)的思路,大大提高代碼的可讀性、可重用性、程序健壯性、可移植性、可維護(hù)性。 制定本編程規(guī)范的目的是為了提高軟件開發(fā)效率及所開發(fā)軟件的可維護(hù)性,提高軟件的質(zhì)量。本規(guī)范由程序風(fēng)格、命名規(guī)范、注釋規(guī)范、程序健壯性、可移植性、錯(cuò)誤處理以及軟件的模塊化規(guī)范等部分組成。 此規(guī)范以C/C++程序設(shè)計(jì)討論。3.1文件結(jié)構(gòu) 每個(gè)C++/C程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序的聲明(declaration),稱為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)(implementation),稱為定義(definition)文件。 C++/C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴,C++程序的定義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。3.1.1文件信息聲明文件信息聲明位于頭文件和定義文件的開頭(參見示例3-1),主要內(nèi)容有:(1)

版權(quán)信息;(2)

文件名稱,項(xiàng)目代碼,摘要,參考文獻(xiàn);(3)

當(dāng)前版本號(hào),作者/修改者,完成日期;(4)

版本歷史信息;(5)

主要函數(shù)描述。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Copyright(c)2015,DeLianSoftCompanyYanTai//Allrightsreserved.////Filename:filename.h//ProjectCode:Theprojectcodeaboutthisfile//Abstract:Describethecontentofthisfilesummarily//Reference:////Version:1.1//Author:thenameofauthor(mender)//Accomplisheddate:September2,2004////Replacedversion:1.0//OriginalAuthor:thenameoforiginalauthor(mender)//Accomplisheddate:September10,2003////Mainfunctions:// Function1Returncode Functionname(ParameterExplain)// Function2Returncode Functionname(ParameterExplain)// ...// FunctionnReturncode Functionname(ParameterExplain)////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////示例3-1文件信息聲明☆

【規(guī)則3.1-1】 文件信息聲明以兩行斜杠開始,以兩行斜杠結(jié)束,每一行都以兩個(gè)斜杠開始;☆

【規(guī)則3.1-2】 文件信息聲明包含五個(gè)部分,各部分之間以一空行間隔;☆

【規(guī)則3.1-3】 在主要函數(shù)部分描述了文件所包含的主要函數(shù)的聲明信息,如果是頭文件,這一部分是可以省略的。3.1.2頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成:(1)

頭文件開頭處的文件信息聲明(參見示例3-1);(2)

預(yù)處理塊;(3)

函數(shù)和類結(jié)構(gòu)聲明等。假設(shè)頭文件名稱為filesystem.h,頭文件的結(jié)構(gòu)參見示例3-2。☆

【規(guī)則3.2-1】 為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊;“#ifndef”或者“#define”后以TAB鍵代替SPACE鍵做空格;如果頭文件名稱是由多個(gè)單詞組成,則各單詞間以下劃線“_”連接,例如有頭文件名稱為“filesystem.h”,則定義如下:“#ifndef _FILE_SYSTEM_H_”;☆

【規(guī)則3.2-2】 用#include<filename.h>格式來引用標(biāo)準(zhǔn)庫的頭文件(編譯器將從標(biāo)準(zhǔn)庫目錄開始搜索);☆

【規(guī)則3.2-3】 用#include“filename.h”格式來引用非標(biāo)準(zhǔn)庫的頭文件(編譯器將從用戶的工作目錄開始搜索);☆

【建議3.2-1】 頭文件中只存放“聲明”而不存放“定義”;☆

【建議3.2-1】 頭文件中應(yīng)包含所有定義文件所定義的函數(shù)聲明,如果一個(gè)頭文件對(duì)應(yīng)多個(gè)定義文件,則不同定義文件內(nèi)實(shí)現(xiàn)的函數(shù)要分開聲明,并作注釋以解釋所聲明的函數(shù)從屬于那一個(gè)定義文件;☆

【建議3.2-3】 宏定義和函數(shù)聲明分離,在兩個(gè)頭文件中定義,如果沒有類成員函數(shù),可以將類和結(jié)構(gòu)的定義與函數(shù)聲明分離,也就是說一個(gè)頭文件專用于宏定義,一個(gè)頭文件專用于類和結(jié)構(gòu)的定義,一個(gè)頭文件專用于函數(shù)聲明;☆

【建議3.2-4】 在C++語法中,類的成員函數(shù)可以在聲明的同時(shí)被定義,并且自動(dòng)成為內(nèi)聯(lián)函數(shù)。這雖然會(huì)帶來書寫上的方便,但卻造成了風(fēng)格不一致,弊大于利。建議將成員函數(shù)的定義與聲明分開,不論該函數(shù)體有多么小。頭文件的結(jié)構(gòu)如下://文件信息聲明見示例3-1,此處省略。

#ifndef _FILE_SYSTEM_H_ //avoidreferencingthefilefilesystem.hrepeat#define _FILE_SYSTEM_H_#include<math.h> //referencestandardheadfile…#include“myheader.h” //referencenon-standardheadfile…voidFunction1(…); //globalfunctiondeclare…classCBox //classstructuredecalre{…};#endif示例3-2C++/C頭文件的結(jié)構(gòu)

3.1.3定義文件的結(jié)構(gòu)定義文件有三部分內(nèi)容:(1)

定義文件開頭處的文件信息聲明(參見示例3-1);(2)

對(duì)一些頭文件的引用;(3)

程序的實(shí)現(xiàn)體(包括數(shù)據(jù)和代碼)。假設(shè)定義文件的名稱為filesystem.c,定義文件的結(jié)構(gòu)參見示例3-3。//文件信息聲明見示例3-1,此處省略。

#include“filesystem.h” //referenceaheadfile…//globalfunctionrealizationvoidFunction1(…){…}

//classmemberfunctionrealizationvoidCBox::Draw(…){…}示例3-3C++/C定義文件的結(jié)構(gòu)3.1.4頭文件的作用 早期的編程語言如Basic、Fortran沒有頭文件的概念,C++/C語言的初學(xué)者雖然會(huì)用使用頭文件,但常常不明其理。這里對(duì)頭文件的作用略作解釋: (1)通過頭文件來調(diào)用庫功能。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫中提取相應(yīng)的代碼; (2)頭文件能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。3.1.5目錄結(jié)構(gòu) 如果一個(gè)軟件的頭文件數(shù)目比較多(如超過十個(gè)),通常應(yīng)將頭文件和定義文件分別保存于不同的目錄,以便于維護(hù)。 例如可將頭文件保存于include目錄,將定義文件保存于source目錄(可以是多級(jí)目錄)。如果某些頭文件是私有的,它不會(huì)被用戶的程序直接引用,則沒有必要公開其“聲明”。為了加強(qiáng)信息隱藏,這些私有的頭文件可以和定義文件存放于同一個(gè)目錄。3.2命名規(guī)則 比較著名的命名規(guī)則當(dāng)推“匈牙利”命名法,該命名規(guī)則的主要思想是“在變量和函數(shù)名中加入前綴以增進(jìn)人們對(duì)程序的理解”。例如所有的字符變量均以ch為前綴,若是指針變量則追加前綴p。如果一個(gè)變量由ppch開頭,則表明它是指向字符指針的指針。 “匈牙利”法最大的缺點(diǎn)是煩瑣,例如 inti,j,k; floatx,y,z; 倘若采用“匈牙利”命名規(guī)則,則應(yīng)當(dāng)寫成 intiI,iJ,ik;//前綴i表示int類型 floatfX,fY,fZ;//前綴f表示float類型 如此煩瑣的程序會(huì)讓絕大多數(shù)程序員無法忍受。 總的說來,沒有一種命名規(guī)則可以讓所有的程序員贊同,且命名規(guī)則對(duì)軟件產(chǎn)品而言并不是“成敗悠關(guān)”的事,而且在不同的平臺(tái)和不同的環(huán)境下編寫的程序所應(yīng)遵循的規(guī)則也不盡相同,所以我們只是追求制定一種令大多數(shù)項(xiàng)目成員滿意的命名規(guī)則,并在項(xiàng)目中貫徹實(shí)施。3.2.1共性原則本節(jié)論述的共性規(guī)則是被大多數(shù)程序員采納的,我們應(yīng)當(dāng)在遵循這些共性規(guī)則的前提下,再擴(kuò)充特定的規(guī)則,如3.2.2節(jié)☆

【規(guī)則3.2.1-1】 標(biāo)識(shí)符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,不必進(jìn)行“解碼”;☆

【規(guī)則3.2.1-2】 標(biāo)識(shí)符的長度應(yīng)當(dāng)符合“min-length&&max-information”原則;☆

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

【規(guī)則3.2.1-4】 程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符。☆

【規(guī)則3.2.1-5】 程序中不要出現(xiàn)標(biāo)識(shí)符完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會(huì)發(fā)生語法錯(cuò)誤,但會(huì)使人誤解;☆

【規(guī)則3.2.1-6】 變量的名字應(yīng)當(dāng)使用“名詞”或者“形容詞+名詞”;☆

【規(guī)則3.2.1-7】 全局函數(shù)的名字應(yīng)當(dāng)使用“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組);☆

【規(guī)則3.2.1-8】 用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等;☆

【建議3.2.1-9】 盡量避免名字中出現(xiàn)數(shù)字編號(hào),如Value1,Value2等,除非邏輯上的確需要編號(hào);注:3.2.1

標(biāo)識(shí)符最好采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名,程序中的英文單詞一般不要太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確,例如不要把CurrentValue寫成NowValue;3.2.2

標(biāo)示符的長度應(yīng)當(dāng)以最小的長度實(shí)現(xiàn)最多信息,一般來說,長名字能更好地表達(dá)含義,但并非長的變量名就一定要比短的變量名要好,此外單字符的名字也是有用的,常見的如i,j,k,m,n,x,y,z等,它們通??捎米骱瘮?shù)內(nèi)的局部變量;3.2.3

不同的操作系統(tǒng)的程序設(shè)計(jì)風(fēng)格是不一樣的,例如Windows應(yīng)用程序的標(biāo)識(shí)符通常采用“大小寫”混排的方式,如AddChild,而Unix應(yīng)用程序的標(biāo)識(shí)符通常采用“小寫加下劃線”的方式,如add_child,別把這兩類風(fēng)格混在一起使用;3.2.2Windows變量命名規(guī)則☆

【規(guī)則3.2.2-1】 變量的命名規(guī)則要求采用“匈牙利法則”,即開頭字母用變量的類型,其余部分用變量的英文意思或其英文意思的縮寫,盡量避免采用中文拼音,要求單詞的第一個(gè)字母大寫;即:變量名=變量類型+變量英文意思(或縮寫)變量類型請(qǐng)參見附表1-變量類型表;☆

【規(guī)則3.2.2-2】 類名和函數(shù)名用大寫字母開頭的單詞組合而成;對(duì)struct、union、class變量的命名要求定義的類型用大寫,結(jié)構(gòu)采用S開頭,聯(lián)合體采用U開頭,類采用C開頭;例如:structSPoint{ int m_nX; int m_nY;};unionURecordLen{ BYTE m_byRecordNum; BYTE m_byRecordLen;} classCNode { //類成員變量或成員函數(shù) };☆

【規(guī)則3.2.2-3】 指針變量命名的基本原則為:一重指針變量的基本原則為: 變量名=“p”+變量類型前綴+命名對(duì)多重指針變量的基本原則為:二重指針:變量名=“pp”+變量類型前綴+命名三重指針: 變量名=“ppp”+變量類型前綴+命名例如一個(gè)short*型的變量應(yīng)該表示為pnStart;☆

【規(guī)則3.2.2-4】 全局變量用g_開頭;例如一個(gè)全局的長型變量定義為g_lFileNum,即:變量名=g_+變量類型+變量的英文意思(或縮寫);☆

【規(guī)則3.2.2-5】 靜態(tài)變量采用s_開頭;例如一個(gè)靜態(tài)的指針變量定義為s_plPrevInst,即:變量名=s_+變量類型+變量的英文意思(或縮寫);☆

【規(guī)則3.2.2-6】 類成員變量采用m_開頭;例如一個(gè)長型成員變量定義為m_lCount,即:變量名=m_+變量類型+變量的英文意思(或縮寫);☆

【規(guī)則3.2.2-7】 對(duì)const的變量要求在變量的命名規(guī)則前加入c_(若作為函數(shù)的輸入?yún)?shù),可以不加),即:變量名=c_+變量命名規(guī)則,例如:constchar*c_szFileName;☆

【規(guī)則3.2.2-8】 對(duì)枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫做前綴,且用下劃線隔離變量名,所有枚舉類型都要用大寫,例如:enum EMDAYS{ EMDAYS_MONDAY; EMDAYS_TUESDAY; };☆

【規(guī)則3.2.2-9】 對(duì)常量(包括錯(cuò)誤的編碼)命名,要求常量名用大寫,常量名用英文意思表示其意思,用下劃線分割單詞,例如:#define CM_7816_OK 0x9000;☆

【規(guī)則3.2.2-10】 為了防止某一軟件庫中的一些標(biāo)識(shí)符和其它軟件庫中的沖突,可以為各種標(biāo)識(shí)符加上能反映軟件性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL的所有庫函數(shù)均以gl開頭,所有常量(或宏定義)均以GL開頭。3.3程序風(fēng)格程序風(fēng)格雖然不會(huì)影響程序的功能,但會(huì)影響程序的可讀性,追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。3.3.1空行空行起著分隔程序段落的作用。空行得體(不過多也不過少)將使程序的布局更加清晰。空行不會(huì)浪費(fèi)內(nèi)存,雖然打印含有空行的程序是會(huì)多消耗一些紙張,但是值得?!?/p>

【規(guī)則3.3.1-1】 在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加空行。參見示例3.3.1(a);☆

【規(guī)則3.3.1-2】 在一個(gè)函數(shù)體內(nèi),邏揖上密切相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。參見示例3.3.1(b);

//blanklinevoidFunction1(…){…}//blanklinevoidFunction2(…){…}//blanklinevoidFunction3(…){…}

//blanklinewhile(condition){ statement1; //blankline if(condition) { statement2; } else { statement3; }//blankline statement4;}示例3.3.1(a)函數(shù)之間的空行示例3.3.1(b)函數(shù)內(nèi)部的空行

3.3.2代碼行☆

【規(guī)則3.3.2-1】 一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語句,這樣的代碼容易閱讀,并且方便于寫注釋;☆

【規(guī)則3.3.2-2】 if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后,不論執(zhí)行語句有多少都要加{},這樣可以防止書寫失誤;☆

【規(guī)則3.3.2-3】 if、for、while、do等語句的“{”要單獨(dú)占用一行;☆

【建議3.3.2-1】 所有函數(shù)內(nèi)的變量都在函數(shù)開始處定義;☆

【建議3.3.2-2】 盡可能在定義變量的同時(shí)初始化該變量(就近原則),如果變量的引用處和其定義處相隔比較遠(yuǎn),變量的初始化很容易被忘記。如果引用了未被初始化的變量,可能會(huì)導(dǎo)致程序錯(cuò)誤,本建議可以減少隱患。示例3.3.2(a)為風(fēng)格良好的代碼行,示例3.3.2(b)為風(fēng)格不良的代碼行。

intnWidth; //widthintnHeight; //heightintnDepth; //depth

intnWidth,nHight,nDepth;//width,height,depth

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

if(nWidth<nHight){ DoSomething();}if(nWidth<nHight)DoSomething();for(initialization;condition;update){DoSomething();}//blanklineOther();

for(initialization;condition;update)DoSomething();Other();

示例3.3.2(a)風(fēng)格良好的代碼行示例3.3.2(b)風(fēng)格不良的代碼行3.3.3代碼行內(nèi)的空格☆

【規(guī)則3.3.3-1】 關(guān)鍵字之后要留空格,象const、virtual、inline、case等關(guān)鍵字之后至少要留一個(gè)空格,否則無法辨析關(guān)鍵字,象if、for、while等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)‘(’,以突出關(guān)鍵字;☆

【規(guī)則3.3.3-2】 函數(shù)名之后不要留空格,緊跟左括號(hào)‘(’,以與關(guān)鍵字區(qū)別;☆

【規(guī)則3.3.3-3】 ‘(’向后緊跟,‘)’、‘,’、‘;’向前緊跟,緊跟處不留空格;☆

【規(guī)則3.3.3-4】 ‘,’之后要留空格,如Function(x,y,z),如果‘;’不是一行的結(jié)束符號(hào),其后要留空格,如for(initialization;condition;update);☆

【規(guī)則3.3.3-5】 賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后應(yīng)當(dāng)加空格;☆

【規(guī)則3.3.3-6】 一元操作符如“!”、“~”、“++”、“--”、“&”(地址運(yùn)算符)等前后不加空格;☆

【規(guī)則3.3.3-7】 象“[]”、“.”、“->”這類操作符前后不加空格;☆

【建議3.3.3-1】 對(duì)于表達(dá)式比較長的for語句和if語句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛崭?,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d))

voidFunc1(intx,inty,intz);//favorablestylevoidFunc1(intx,inty,intz);//illstyleif(year>=2000)//favorablestyleif(year>=2000)//illstyleif((a>=b)&&(c<=d))//favorablestyleif(a>=b&&c<=d)//illstylefor(i=0;i<10;i++)//favorablestylefor(i=0;i<10;i++)//illstylefor(i=0;I<10;i++)//favorablestylex=a<b?a:b;//favorablestylex=a<b?a:b;//illstyleint*x=&y;//favorablestyleint*x=&y;//illstylearray[5]=0;//Donotusearray[5]=0;a.Function();//Donotusea.Function();b->Function();//Donotuseb->Function();

示例3.3.3代碼行內(nèi)的空格

3.3.4對(duì)齊☆

【規(guī)則3.3.4-1】 程序的分界符‘{’和‘}’應(yīng)獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語句左對(duì)齊;☆

【規(guī)則3.3.4-2】 {}之內(nèi)的代碼塊在‘{’右邊數(shù)格處左對(duì)齊;☆

【規(guī)則3.3.4.3】 代碼的的對(duì)齊采用TAB鍵而不采用空格鍵對(duì)齊,一般TAB鍵設(shè)置為向后空4個(gè)空格。

示例3.3.4(a)為風(fēng)格良好的對(duì)齊,示例3.3.4(b)為風(fēng)格不良的對(duì)齊。

voidFunction(intx){…//programcode}

voidFunction(intx){…//programcode}

if(condition){…//programcode}else{…//programcode}if(condition){…//programcode}else{…//programcode}for(initialization;condition;update){…//programcode}for(initialization;condition;update){…//programcode}While(condition){…//programcode}while(condition){…//programcode}如果出現(xiàn)嵌套的{},則使用縮進(jìn)對(duì)齊,如: { … { … } …}

示例3.3.4(a)風(fēng)格良好的對(duì)齊示例3.3.4(b)風(fēng)格不良的對(duì)齊3.3.5長行拆分☆

【規(guī)則3.3.5-1】 代碼行最大長度宜控制在70至80個(gè)字符以內(nèi);☆

【規(guī)則3.3.5-2】 長表達(dá)式要在低優(yōu)先級(jí)操作符處拆分成新行,操作符放在新行之首(以便突出操作符),拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。

if((very_longer_variable1>=very_longer_variable12)&&(very_longer_variable3<=very_longer_variable14)&&(very_longer_variable5<=very_longer_variable16)){DoSomething();}virtualCMatrixCMultiplyMatrix(CMatrixleftMatrix,CMatrixrightMatrix);

for(very_longer_initialization; very_longer_condition; very_longer_update){ DoSomething();}示例3.3.5長行的拆分3.3.6修飾符的位置修飾符*和&應(yīng)該靠近數(shù)據(jù)類型還是該靠近變量名,是個(gè)有爭議的活題,若將修飾符*靠近數(shù)據(jù)類型,例如:int*x;從語義上講此寫法比較直觀,即x是int類型的指針,上述寫法的弊端是容易引起誤解,例如:int*x,y;此處y容易被誤解為指針變量。雖然將x和y分行定義可以避免誤解,但并不是人人都愿意這樣做?!?/p>

【規(guī)則3.3.6-1】 應(yīng)當(dāng)將修飾符*和&緊靠變量名;3.3.7注釋C語言的注釋符為“/*…*/”。C++語言中,程序塊的注釋常采用“/*…*/”,行注釋一般采用“//…”。注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過多地使用注釋。參見示例3.3.7。

【規(guī)則3.3.7-1】 注釋是對(duì)代碼的“提示”,而不是文檔,程序中的注釋不可喧賓奪主,注釋太多了會(huì)讓人眼花繚亂,注釋的花樣要少;☆

【規(guī)則3.3.7-2】 如果代碼本來就是清楚的,則不必加注釋;例如i++; //i加1,多余的注釋☆

【規(guī)則3.3.7-3】 邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性,不再有用的注釋要?jiǎng)h除;☆

【規(guī)則3.3.7-4】 注釋應(yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性,錯(cuò)誤的注釋不但無益反而有害;☆

【規(guī)則3.3.7-5】 盡量避免在注釋中使用縮寫,特別是不常用縮寫;☆

【規(guī)則3.3.7-6】 注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方;☆

【規(guī)則3.3.7-8】 當(dāng)代碼比較長,特別是有多重嵌套時(shí),應(yīng)當(dāng)在一些段落的結(jié)束處加注釋,便于閱讀;☆

【建議3.3.7-9】 對(duì)于多行代碼的注釋,盡量不采用“/*...*/”,而采用多行“//”注釋,這樣雖然麻煩,但是在做屏蔽調(diào)試時(shí)不用查找配對(duì)的“/*...*/”。

//////////////////////////////////////////////////////////////////////Functioncapacity://Parameterdeclare://Returnvalue:////////////////////////////////////////////////////////////////////voidFunction(floatx,floaty,floatz){…}

if(…){…while(…){…}//endofwhile…}//endofif示例3.3.7程序的注釋3.7.1文件頭的注釋 文件頭的注釋請(qǐng)參見3.1,文件頭的注釋是以兩行斜杠開始,以兩行斜杠結(jié)束(以區(qū)別于函數(shù)的注釋)。3.7.2函數(shù)頭的注釋一般說來每個(gè)函數(shù)都應(yīng)該做詳細(xì)的注釋,函數(shù)頭的注釋是以一行斜杠開始,以一行斜杠結(jié)束,注釋的內(nèi)容包括“功能”,“參數(shù)”,“返回值”,“設(shè)計(jì)思想”,“調(diào)用函數(shù)”,“日期”,“修改記錄”等幾個(gè)方面,函數(shù)頭的注釋格式如下:////////////////////////////////////////////////////////////////////////////////////////////////Functioncapacity: Describethefunctioncapacity//Parameterdeclare:// parameter1: Describethefunctionofparameter(input/outputparameter)// parameter2: Describethefunctionofparameter(input/outputparameter)// //Returnvalue:Describethepossiblereturnvalue//Designedidea:Describedesignedideaaboutthefunction//Author: //Creationdate:Creationdate(YY-MM-DD)//Transferredfunction: Listthesub-functioninthefunction//Modificationrecord:// (一)Mender1: Modifieddate: modifiedcontent//////////////////////////////////////////////////////////////////////////////////////////////

3.4函數(shù)設(shè)計(jì) 函數(shù)是C++/C程序的基本功能單元,其重要性不言而喻。函數(shù)設(shè)計(jì)的細(xì)微缺點(diǎn)很容易導(dǎo)致該函數(shù)被錯(cuò)用,所以光使函數(shù)的功能正確是不夠的。本章重點(diǎn)論述函數(shù)的接口設(shè)計(jì)和內(nèi)部實(shí)現(xiàn)的一些規(guī)則。 函數(shù)接口的兩個(gè)要素是參數(shù)和返回值。C語言中,函數(shù)的參數(shù)和返回值的傳遞方式有兩種:值傳遞(passbyvalue)和指針傳遞(passbypointer)。C++語言中多了引用傳遞(passbyreference)。由于引用傳遞的性質(zhì)象指針傳遞,而使用方式卻象值傳遞,初學(xué)者常常迷惑不解,容易引起混亂,請(qǐng)先閱讀3.4.6節(jié)“引用與指針的比較”。3.4.1參數(shù)的規(guī)則☆

【規(guī)則3.4.1-1】 參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字,如果函數(shù)沒有參數(shù),則用void填充;例如:voidSetValue(intnWidth,intnHeight); //良好的風(fēng)格voidSetValue(int,int); //不良的風(fēng)格floatGetValue(void); //良好的風(fēng)格floatGetValue(); //不良的風(fēng)格☆

【規(guī)則3.4.1-2】 參數(shù)命名要恰當(dāng),順序要合理;例如編寫字符串拷貝函數(shù)StringCopy,它有兩個(gè)參數(shù),如果把參數(shù) 名字起為str1和str2,例如:voidStringCopy(char*str1,char*str2);那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來,可以把參數(shù)名字起得更有意義,如叫strSource和strDestination。這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。還有一個(gè)問題,這兩個(gè)參數(shù)那一個(gè)該在前那一個(gè)該在后?參數(shù)的順序要遵循程序員的習(xí)慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:voidStringCopy(char*strSource,char*strDestination);別人在使用時(shí)可能會(huì)不假思索地寫成如下形式:charstr[20];StringCopy(str,“HelloWorld”); //參數(shù)順序顛倒

【規(guī)則3.4.1-3】 如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。例如:voidStringCopy(char*strDestination,constchar*strSource);☆

【規(guī)則3.4.1-4】 如果輸入?yún)?shù)以值傳遞的方式傳遞對(duì)象,則宜改用“const&”方式來傳遞,這樣可以省去臨時(shí)對(duì)象的構(gòu)造和析構(gòu)過程,從而提高效率;☆

【建議3.4.1-1】 避免函數(shù)有太多的參數(shù),參數(shù)個(gè)數(shù)盡量控制在5個(gè)以內(nèi)。如果參數(shù)太多,在使用時(shí)容易將參數(shù)類型或順序搞錯(cuò);☆

【建議3.4.1-2】 盡量不要使用類型和數(shù)目不確定的參數(shù);C標(biāo)準(zhǔn)庫函數(shù)printf是采用不確定參數(shù)的典型代表,其原型為:intprintf(constchat*format[,argument]…);這種風(fēng)格的函數(shù)在編譯時(shí)喪失了嚴(yán)格的類型安全檢查。3.4.2返回值的規(guī)則☆

【規(guī)則3.4.2-1】 不要省略返回值的類型;C語言中,凡不加類型說明的函數(shù),一律自動(dòng)按整型處理,這樣做不會(huì)有什么好處,卻容易被誤解為void類型;C++語言有很嚴(yán)格的類型安全檢查,不允許上述情況發(fā)生。由于C++程序可以調(diào)用C函數(shù),為了避免混亂,規(guī)定任何C++/C函數(shù)都必須有類型。如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型☆

【規(guī)則3.4.2-2】 函數(shù)名字與返回值類型在語義上不可沖突;違反這條規(guī)則的典型代表是C標(biāo)準(zhǔn)庫函數(shù)getchar。例如:charc;c=getchar();if(c==EOF)…按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:intgetchar(void);由于c是char類型,取值范圍是[-128,127],如果宏EOF的值在char的取值范圍之外,那么if語句將總是失敗,這種“危險(xiǎn)”人們一般哪里料得到!導(dǎo)致本例錯(cuò)誤的責(zé)任并不在用戶,是函數(shù)getchar誤導(dǎo)了使用者☆

【規(guī)則3.4.2-3】 不要將正常值和錯(cuò)誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯(cuò)誤標(biāo)志用return語句返回;☆

【建議3.4.2-1】 有時(shí)候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值;例如字符串拷貝函數(shù)strcpy的原型:char*strcpy(char*strDest,constchar*strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時(shí)函數(shù)的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:charstr[20];intnLength=strlen(strcpy(str,“HelloWorld”));☆

【建議3.4.2-2】 如果函數(shù)的返回值是一個(gè)對(duì)象,有些場(chǎng)合用“引用傳遞”替換“值傳遞”可以提高效率。而有些場(chǎng)合只能用“值傳遞”而不能用“引用傳遞”,否則會(huì)出錯(cuò);對(duì)于建議3.4.2-2,如果函數(shù)的返回值是一個(gè)對(duì)象,有些場(chǎng)合用“引用傳遞”替換“值傳遞”可以提高效率,而有些場(chǎng)合只能用“值傳遞”而不能用“引用傳遞”,否則會(huì)出錯(cuò),例如:classString{… //賦值函數(shù) String&operate=(constString&other); //相加函數(shù),如果沒有friend修飾則只許有一個(gè)右側(cè)參數(shù)friend Stringoperate+(constString&s1,constString&s2);private: char*m_data;};String的賦值函數(shù)operate=的實(shí)現(xiàn)如下:String&String::operate=(constString&other){ if(this==&other) return*this; deletem_data; m_data=newchar[strlen(other.data)+1]; strcpy(m_data,other.data); return*this; //返回的是*this的引用,無需拷貝過程}對(duì)于賦值函數(shù),應(yīng)當(dāng)用“引用傳遞”的方式返回String對(duì)象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return語句要把*this拷貝到保存返回值的外部存儲(chǔ)單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。例如: Stringa,b,c; … a=b; //如果用“值傳遞”,將產(chǎn)生一次*this拷貝 a=b=c; //如果用“值傳遞”,將產(chǎn)生兩次*this拷貝

String的相加函數(shù)operate+的實(shí)現(xiàn)如下:Stringoperate+(constString&s1,constString&s2){ Stringtemp; deletetemp.data; //temp.data是僅含‘\0’的字符串 temp.data=newchar[strlen(s1.data)+strlen(s2.data)+1]; strcpy(temp.data,s1.data); strcat(temp.data,s2.data); returntemp; }

對(duì)于相加函數(shù),應(yīng)當(dāng)用“值傳遞”的方式返回String對(duì)象。如果改用“引用傳遞”,那么函數(shù)返回值是一個(gè)指向局部對(duì)象temp的“引用”。由于temp在函數(shù)結(jié)束時(shí)被自動(dòng)銷毀,將導(dǎo)致返回的“引用”無效。例如: c=a+b;此時(shí)a+b并不返回期望值,c什么也得不到,流下了隱患。3.4.3函數(shù)內(nèi)部實(shí)現(xiàn)的規(guī)則不同功能的函數(shù)其內(nèi)部實(shí)現(xiàn)各不相同,看起來似乎無法就“內(nèi)部實(shí)現(xiàn)”達(dá)成一致的觀點(diǎn)。但根據(jù)經(jīng)驗(yàn),我們可以在函數(shù)體的“入口處”和“出口處”從嚴(yán)把關(guān),從而提高函數(shù)的質(zhì)量。

【規(guī)則3.4.3-1】 在函數(shù)體的“入口處”,對(duì)參數(shù)的有效性進(jìn)行檢查;很多程序錯(cuò)誤是由非法參數(shù)引起的,我們應(yīng)該充分理解并正確使用“斷言”(assert)來防止此類錯(cuò)誤。詳見4.5節(jié)“使用斷言”☆

【規(guī)則3.4.3-2】 在函數(shù)體的“出口處”,對(duì)return語句的正確性和效率進(jìn)行檢查;注意事項(xiàng)如下:(1)

return語句不可返回指向“棧內(nèi)存”的“指針”或者“引用”,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動(dòng)銷毀,例如: char*Func(void) { charstr[]=“helloworld”; //str的內(nèi)存位于棧上 … returnstr; //將導(dǎo)致錯(cuò)誤 }(2)

要搞清楚返回的究竟是“值”、“指針”還是“引用”;(3)

如果函數(shù)返回值是一個(gè)對(duì)象,要考慮return語句的效率,例如: returnString(s1+s2);這是臨時(shí)對(duì)象的語法,表示“創(chuàng)建一個(gè)臨時(shí)對(duì)象并返回它”,不要以為它與“先創(chuàng)建一個(gè)局部對(duì)象temp并返回它的結(jié)果”是等價(jià)的,如 Stringtemp(s1+s2); returntemp;實(shí)質(zhì)不然,上述代碼將發(fā)生三件事。 首先,temp對(duì)象被創(chuàng)建,同時(shí)完成初始化; 然后拷貝構(gòu)造函數(shù)把temp拷貝到保存返回值的外部存儲(chǔ)單元中; 最后,temp在函數(shù)結(jié)束時(shí)被銷毀(調(diào)用析構(gòu)函數(shù))。然而“創(chuàng)建一個(gè)臨時(shí)對(duì)象并返回它”的過程是不同的,編譯器直接把臨時(shí)對(duì)象創(chuàng)建并初始化在外部存儲(chǔ)單元中,省去了拷貝和析構(gòu)的化費(fèi),提高了效率。類似地,我們不要將 returnint(x+y); //創(chuàng)建一個(gè)臨時(shí)變量并返回它寫成 inttemp=x+y; returntemp;由于內(nèi)部數(shù)據(jù)類型如int,float,double的變量不存在構(gòu)造函數(shù)與析構(gòu)函數(shù),雖然該“臨時(shí)變量的語法”不會(huì)提高多少效率,但是程序更加簡潔易讀。3.4.4其它建議☆

【建議3.4.4-1】 函數(shù)的功能要單一,不要設(shè)計(jì)多用途的函數(shù);☆

【建議3.4.4-2】 函數(shù)體的規(guī)模要小,盡量控制在150行代碼之內(nèi);☆

【建議3.4.4-3】 盡量避免函數(shù)帶有“記憶”功能。相同的輸入應(yīng)當(dāng)產(chǎn)生相同的輸出帶有“記憶”功能的函數(shù),其行為可能是不可預(yù)測(cè)的,因?yàn)樗男袨榭赡苋Q于某種“記憶狀態(tài)”。這樣的函數(shù)既不易理解又不利于測(cè)試和維護(hù)。在C/C++語言中,函數(shù)的static局部變量是函數(shù)的“記憶”存儲(chǔ)器。建議盡量少用static局部變量,除非必需?!?/p>

【建議3.4.4-4】 不僅要檢查輸入?yún)?shù)的有效性,還要檢查通過其它途徑進(jìn)入函數(shù)體內(nèi)的變量的有效性,例如全局變量、文件句柄等;☆

【建議3.4.4-5】 用于出錯(cuò)處理的返回值一定要清楚,讓使用者不容易忽視或誤解錯(cuò)誤情況。3.4.5使用斷言程序一般分為Debug版本和Release版本,Debug版本用于內(nèi)部調(diào)試,Release版本發(fā)行給用戶使用。斷言assert是僅在Debug版本起作用的宏,它用于檢查“不應(yīng)該”發(fā)生的情況。示例4.5是一個(gè)內(nèi)存復(fù)制函數(shù)。在運(yùn)行過程中,如果assert的參數(shù)為假,那么程序就會(huì)中止(一般地還會(huì)出現(xiàn)提示對(duì)話,說明在什么地方引發(fā)了assert)。

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;}示例3.4.5復(fù)制不重疊的內(nèi)存塊

assert不是一個(gè)倉促拼湊起來的宏。為了不在程序的Debug版本和Release版本引起差別,assert不應(yīng)該產(chǎn)生任何副作用。所以assert不是函數(shù),而是宏。程序員可以把a(bǔ)ssert看成一個(gè)在任何系統(tǒng)狀態(tài)下都可以安全使用的無害測(cè)試手段。如果程序在assert處終止了,并不是說含有該assert的函數(shù)有錯(cuò)誤,而是調(diào)用者出了差錯(cuò),assert可以幫助我們找到發(fā)生錯(cuò)誤的原因。

【規(guī)則3.4.5-1】 使用斷言捕捉不應(yīng)該發(fā)生的非法情況,不要混淆非法情況與錯(cuò)誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的;☆

【規(guī)則3.4.5-2】 在函數(shù)的入口處,使用斷言檢查參數(shù)的有效性(合法性);☆

【建議3.4.5-1】 在編寫函數(shù)時(shí),要進(jìn)行反復(fù)的考查,并且自問:“我打算做哪些假定?”一旦確定了的假定,就要使用斷言對(duì)假定進(jìn)行檢查;☆

【建議3.4.5-2】 一般教科書都鼓勵(lì)程序員們進(jìn)行防錯(cuò)設(shè)計(jì),但要記住這種編程風(fēng)格可能會(huì)隱瞞錯(cuò)誤。當(dāng)進(jìn)行防錯(cuò)設(shè)計(jì)時(shí),如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進(jìn)行報(bào)警。3.4.6引用與指針的比較引用是C++中的概念,初學(xué)者容易把引用和指針混淆一起。一下程序中,n是m的一個(gè)引用(reference),m是被引用物(referent)。 intm; int&n=m;n相當(dāng)于m的別名(綽號(hào)),對(duì)n的任何操作就是對(duì)m的操作。所以n既不是m的拷貝,也不是指向m的指針,其實(shí)n就是m它自己。引用的一些規(guī)則如下:(1)

引用被創(chuàng)建的同時(shí)必須被初始化(指針則可以在任何時(shí)候被初始化);(2)

不能有NULL引用,引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)(指針則可以是NULL);(3)

一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時(shí)改變所指的對(duì)象)。 以下示例程序中,k被初始化為i的引用。語句k=j并不能將k修改成為j的引用,只是把k的值改變成為6。由于k是i的引用,所以i的值也變成了6。 inti=5; intj=6; int&k=i; k=j; //k和i的值都變成了6; 上面的程序看起來象在玩文字游戲,沒有體現(xiàn)出引用的價(jià)值。引用的主要功能是傳遞函數(shù)的參數(shù)和返回值。C++語言中,函數(shù)的參數(shù)和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。 以下是“值傳遞”的示例程序。由于Func1函數(shù)體內(nèi)的x是外部變量n的一份拷貝,改變x的值不會(huì)影響n,所以n的值仍然是0。 voidFunc1(intx){ x=x+10;}…intn=0; Func1(n); cout<<“n=”<<n<<endl; //n=0 以下是“指針傳遞”的示例程序。由于Func2函數(shù)體內(nèi)的x是指向外部變量n的指針,改變?cè)撝羔樀膬?nèi)容將導(dǎo)致n的值改變,所以n的值成為10。 voidFunc2(int*x){ (*x)=(*x)+10;}…intn=0; Func2(&n); cout<<“n=”<<n<<endl; //n=10

以下是“引用傳遞”的示例程序。由于Func3函數(shù)體內(nèi)的x是外部變量n的引用,x和n是同一個(gè)東西,改變x等于改變n,所以n的值成為10。 voidFunc3(int&x){ x=x+10;}…intn=0; Func3(n); cout<<“n=”<<n<<endl; //n=10

對(duì)比上述三個(gè)示例程序,會(huì)發(fā)現(xiàn)“引用傳遞”的性質(zhì)象“指針傳遞”,而書寫方式象“值傳遞”。3.5變量類型定義類型規(guī)則范例bool(BOOL)用b開頭bIsParentbyte(BYTE)用by開頭byFlagshort(SHORT)用n開頭nFileLenint(INT)用n開頭nStepCountlong(LONG)用l開頭lSizechar(CHAR)用ch開頭chCountunsignedshort(WORD)用w開頭wLengthunsignedlong(DWORD)用dw開頭dwBroadvoid(VOID)用v開頭vVariant用0結(jié)尾的字符串用sz開頭szFileNameLPCSTR(LPCTSTR)用str開頭strStringHANDLE(HINSTANCE)用h開頭hHandlestruct用blk開頭blkTemplateBYTE*用pb開頭pbValu

溫馨提示

  • 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)論