C+基礎(chǔ)知識筆記_第1頁
C+基礎(chǔ)知識筆記_第2頁
C+基礎(chǔ)知識筆記_第3頁
C+基礎(chǔ)知識筆記_第4頁
C+基礎(chǔ)知識筆記_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計(jì)學(xué)習(xí)筆記 本筆記中的程序均在Microsoft Visual C+ 6.0中測試正確目 錄目 錄2一、C+的認(rèn)識和總結(jié)31.1 類的認(rèn)識31.1.1 類的定義31.1.2 類的對象41.1.3 類成員的訪問41.1.4 構(gòu)造函數(shù)51.1.5 拷貝構(gòu)造函數(shù)61.1.6 析構(gòu)函數(shù)71.2 類的繼承81.3 虛函數(shù)101.4 運(yùn)算符的重載121.5 友元的使用131.6 類模板141.7 this指針14二、C/C+程序代碼設(shè)計(jì)規(guī)范142.1 命名規(guī)范142.2 表達(dá)式設(shè)計(jì)142.3 條件語句設(shè)計(jì)152.4 循環(huán)語句設(shè)計(jì)152.5 常量設(shè)計(jì)152.6 函數(shù)設(shè)計(jì)152.7 注釋規(guī)范16三、

2、函數(shù)參數(shù)的傳遞方式163.1 函數(shù)調(diào)用的作用163.2 函數(shù)參數(shù)傳遞機(jī)制163.3 判斷二種傳遞方式173.4 引用和取地址的區(qū)別173.5 關(guān)于引用的一點(diǎn)迷惑17四、C/C+中的位運(yùn)算的用法174.1 位運(yùn)算符介紹174.2邏輯運(yùn)算174.2.1 & (按位與)174.2.2 | (按位或)184.2.3 (按位異或)184.2.4 (取反)184.3 移位操作符184.3.1 (右移)19五、實(shí)踐筆記19一、C+的認(rèn)識和總結(jié)這部分筆記是學(xué)習(xí)C+時(shí)自己對一些基礎(chǔ)和概念的總結(jié),剛開始接觸C+的類的時(shí)候,總是覺得一頭霧水的,總不明白為什么會(huì)有各種定義,或者類中所定義的內(nèi)容到底是什么意思,該怎么用

3、。通過看書和網(wǎng)上查找資料,做了幾個(gè)程序后,對其有一點(diǎn)點(diǎn)認(rèn)識和理解。1.1 類的認(rèn)識1.1.1 類的定義結(jié)構(gòu)體只描述了一個(gè)物體的屬性,而類不僅描述了一個(gè)物體的屬性,而且還描述了一個(gè)物體的行為。在類中,如果沒有指名成員的類型,則默認(rèn)為私有成員;在結(jié)構(gòu)體中,如果沒有指名成員的類型,則默認(rèn)為公有成員。一個(gè)類里面包括:成員變量和成員函數(shù)。成員變量:該類事物所具有的屬性。成員函數(shù):該類事物所具有的行為。類的完整聲明class Cpublic:公用的數(shù)據(jù)和成員函數(shù) .;private:私有的數(shù)據(jù).;protected:保護(hù)的數(shù)據(jù)和成員函數(shù).; /分號不能丟示例一class CUserpublic:char

4、m_Username128; /成員變量char m_Password128;bool Login(); /成員函數(shù);bool CUser:Login() /相關(guān)操作示例二class CUser /聲明一個(gè)類public:char m_Username128;/定義數(shù)據(jù)成員char m_Password128;/定義數(shù)據(jù)成員bool Login() /定義方法/相關(guān)操作;二種方法一樣,但是一比較常用,因?yàn)榉绞揭话讯x和使用分開,是程序的可讀性提高。1.1.2 類的對象對象就是類的實(shí)例化。類是一種數(shù)據(jù)類型,對象就是這個(gè)類數(shù)據(jù)類型的變量。(可以這么去理解)class Pen /聲明一個(gè)類 Penp

5、ublic: /表示下面聲明的變量都是公有的int size; /聲明一個(gè)公有的成員變量sizevoid write(); /聲明一個(gè)公有的成員函數(shù)write;Pen pen ; /這里是聲明一個(gè)Pen類的對象理解: CPen 就相當(dāng)于一個(gè)筆的模型,這就是這個(gè)類不是其他的東西(比如車、房子、桌子.),而已經(jīng)是個(gè)筆了。pen前提下它是一支筆,至于是 鋼筆、油筆、鉛筆、還是別的筆,就是對象。類是不占內(nèi)存空間的,只有實(shí)例化對象后才占內(nèi)存。1.1.3 類成員的訪問當(dāng)定義一個(gè)類的對象之后,就可以對這個(gè)類的成員進(jìn)行訪問調(diào)用了。class Pen/聲明一個(gè)類 Penpublic: /表示下面聲明的變量都是公

6、有的int size;/聲明一個(gè)公有的成員變量sizevoid write(); /聲明一個(gè)公有的成員函數(shù)write;int main()Pen pen ; /定義一個(gè)對象penpen.size=10;/為對象pen的size賦值cout the size is pen.size 來訪問成員。Pen * p = new Pen;p-size = 20;p-write(); /調(diào)用成員函數(shù)使用類的對象時(shí),為什么要初始化? 因?yàn)樵谑褂妙惖膶ο蟮臅r(shí)候,必須進(jìn)行初始化,否則對象里面是垃圾值。1.1.4 構(gòu)造函數(shù)構(gòu)造函數(shù)是特殊的成員函數(shù),它的函數(shù)名必須與類的名稱一致,并且不是由用戶來調(diào)用的,而是在建立對

7、象的同時(shí)自動(dòng)執(zhí)行的。并且構(gòu)造函數(shù)沒有返回值,可以有參數(shù),可以重載。為什么要構(gòu)造函數(shù)?因?yàn)樵陬愔?,私有成員和保護(hù)成員不能通過類的示例對象進(jìn)行初始化。而使用構(gòu)造函數(shù)來進(jìn)行對象的成員初始化。class Aprivate:int m_size = 10; /error,不能在類中進(jìn)行初始化public:int m_size = 10; /這樣是可以的,但這樣數(shù)據(jù)就可以被外界更改,失去了數(shù)據(jù)封裝性。示例:class Penpublic:Pen(int size=10);/聲明具有默認(rèn)參數(shù)的默認(rèn)構(gòu)造函數(shù)int GetSize();/成員函數(shù)的聲明int SetSize(int size);void Wri

8、te();private:int m_size;Pen:Pen(int size)m_size=size;void Pen:Write()coutthe size of pen is m_sizeendl;int main()Pen pen1;/默認(rèn)參數(shù)的構(gòu)造函數(shù)的調(diào)用pen1.Write();Pen pen2(15);/參數(shù)取代默認(rèn)參數(shù)的構(gòu)造函數(shù)調(diào)用pen2.Write();return 0;/*the size of pen is 10the size of pen is 15Press any key to continu*/1.1.5 拷貝構(gòu)造函數(shù)當(dāng)需要很多相同的對象時(shí),就要進(jìn)行多次重

9、復(fù)的初始化,所以需要拷貝構(gòu)造函數(shù)來實(shí)現(xiàn)。拷貝構(gòu)造函數(shù):深拷貝(通常用于當(dāng)構(gòu)造函數(shù)分配有堆內(nèi)存資源(動(dòng)態(tài)分配)時(shí)),淺拷貝(一般的拷貝)。示例:#include stdafx.h#includeusing namespace std;class Pen/聲明一個(gè)Pen類private:int m_size;public:Pen(int size);Pen(Pen &pen);/聲明一個(gè)Pen類的復(fù)制構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù))int GetSize();void Write();Pen:Pen(int size)m_size=size;Pen:Pen(Pen &pen)/復(fù)制構(gòu)造函數(shù)的定義(拷貝構(gòu)造

10、函數(shù)的定義方式)m_size=pen.GetSize();coutsize and long;int Pen:GetSize()return m_size;void Pen:Write()coutthe value of m_size is GetSize()endl;int main()Pen pen1(10);pen1.Write();Pen pen2(pen1);/調(diào)用復(fù)制構(gòu)造函數(shù)pen2.Write();return 0;經(jīng)驗(yàn):如果你的類需要析構(gòu)函數(shù)來析構(gòu)資源,則它也需要一個(gè)拷貝構(gòu)造函數(shù)。因?yàn)閷ο蠖际亲詣?dòng)析構(gòu)的,如果需要一個(gè)自定義的析構(gòu)函數(shù),那就意味著也需要一個(gè)拷貝構(gòu)造函數(shù)。如果不自定

11、義構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù),則系統(tǒng)會(huì)調(diào)用默認(rèn)的相應(yīng)的函數(shù)。1.1.6 析構(gòu)函數(shù)因?yàn)楫?dāng)使用完對象時(shí),要進(jìn)行清理,所以需要析構(gòu)函數(shù)。什么是析構(gòu)函數(shù)?特殊的類成員函數(shù),它沒有返回類型,沒有參數(shù),不能隨意調(diào)用,也沒有重載。只有在類對象生命期結(jié)束的時(shí)候,由系統(tǒng)自動(dòng)調(diào)用。一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但是只能有一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)的定義方法:在構(gòu)造函數(shù)名前加上“”,表示“逆構(gòu)造函數(shù)”。如: 構(gòu)造函數(shù) pen() 析構(gòu)函數(shù) pen()示例:#include stdafx.h#includeusing namespace std;class Penpublic:Pen(int size=10);Pen(

12、);/聲明析構(gòu)函數(shù)int GetSize();int SetSize(int size);void Write();private:int m_size;Pen:Pen(int size)m_size=size;Pen:Pen()/定義析構(gòu)函數(shù)coutthis is destructor calledm_sizeendl;void Pen:Write()coutthe size of pen is m_sizeendl;int main()Pen pen1;pen1.Write();Pen pen2(15);pen2.Write();return 0;/*the size of pen is

13、10the size of pen is 15this is destructor called15this is destructor called10Press any key to continue*/1.2 類的繼承繼承是一種編程技術(shù),也是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)非常重要的特征。是C+語言的精華和真諦。類繼承的新類稱為派生類或子類,原有類稱為基類或父類。繼承父類的子類,可以調(diào)用父類的成員數(shù)據(jù)或成員函數(shù)。繼承的分類:單一繼承:以一個(gè)基類派生新類。多重繼承:繼承多個(gè)基類。派生新類的語法單一繼承:語法: class 派生類名 : 訪問限定符 基類名例如: class A : public B多

14、重繼承:語法: class 類名稱 : 訪問限定符1 基類1名稱, 訪問限定符2 基類2名稱.例如: class C: public class A, public class B覆蓋成員函數(shù)如果在派生類中聲明一個(gè)成員函數(shù),這個(gè)成員函數(shù)與基類的一個(gè)成員函數(shù)相同,當(dāng)定義派生類的對象時(shí),通過對象調(diào)用這個(gè)成員函數(shù)時(shí),那么訪問的是派生類中的還是基類中的呢?訪問的是派生類中的成員函數(shù)。這就叫做成員函數(shù)的覆蓋。注意:如果此時(shí)想要派生類去調(diào)用基類的成員函數(shù),這要加上作用域限定符“:”。如:rect.CShare:display()示例:#include stdafx.h#includeusing names

15、pace std;class CShape/聲明一個(gè)CShape類private:int m_color;/聲明一個(gè)私有成員變量public:CShape(int color=10);/聲明帶有默認(rèn)參數(shù)的構(gòu)造函數(shù)void display();CShape:CShape(int color)/默認(rèn)參數(shù)的構(gòu)造函數(shù)的定義m_color=color;/對成員變量進(jìn)行賦值void CShape:display()/CShape成員函數(shù)的定義coutThis is a Shapeendl;class CRect :public CShape/聲明一個(gè)派生自CShape類的CRectprivate:int

16、m_size;/聲明一個(gè)私有成員變量public:CRect(int size=20);/聲明默認(rèn)參數(shù)的構(gòu)造函數(shù)void display();CRect:CRect(int size)/默認(rèn)參數(shù)的構(gòu)造函數(shù)的定義m_size=size;void CRect:display()/CRect的成員函數(shù)的定義coutThis is a Rectendl;int main()CShape shape;shape.display();/調(diào)用CShape類的成員函數(shù)CRect rect;/定義CRect類的對象rect.display();/調(diào)用派生類CRect的成員函數(shù)rect.CShape:displa

17、y();/通過限定符來用派生類調(diào)用基類的成員函數(shù)return 0;/*This is a ShapeThis is a RectThis is a ShapePress any key to continue*/1.3 虛函數(shù)利用虛函數(shù)可以使用相同的代碼實(shí)現(xiàn)不同的功能調(diào)用。虛函數(shù)可以使操作趨于一般化。虛函數(shù)的聲明:和普通的成員函數(shù)的聲明相似,只是在前面加上了關(guān)鍵字virtual。class Apublic:virtual void display();示例:#include stdafx.h#includeusing namespace std;class CSubject/聲明一個(gè)CSubj

18、ect類public:virtual void display();/聲明一個(gè)虛函數(shù);void CSubject:display()/定義CSubject的虛函數(shù)coutthis is Subjectendl;class CChinese: public CSubject/聲明一個(gè)派生自CSubject的CChinese類public:virtual void display();void CChinese:display()/定義CChinese的虛函數(shù)coutthis is Chinesedisplay();/通過指針調(diào)用基類的虛函數(shù)p=&chinese;/將派生類地址賦值給基類指針p-d

19、isplay();/調(diào)用派生類的虛函數(shù)return 0;/*this is Subjectthis is ChinesePress any key to continue*/首先定義基類CSubject,在基類中聲明一個(gè)虛函數(shù)display,來輸出一句話。在基類的基礎(chǔ)上派生各個(gè)學(xué)科的類,并在每個(gè)派生類的外都改寫display這個(gè)虛函數(shù),輸出一句特定的話。在主函數(shù)main中,首先聲明CSubject類的指針變量p,然后定義每個(gè)類的對象。將CSubject的對象地址傳遞給指針p,通過指針p調(diào)用CSubject的display函數(shù)。然后將每個(gè)派生類的對象的地址傳遞給指針p,通過指針p調(diào)用各個(gè)派生類的

20、display函數(shù)。利用這樣的方法就可以使用指針p調(diào)用所有類的display函數(shù)了。如果在基類中聲明成員函數(shù)為虛函數(shù),在將派生類的對象傳遞給基類指針,通過這個(gè)基類指針就可以調(diào)用派生類中的虛函數(shù),這樣就建立了一般化操作。純虛函數(shù)基類是為了派生類而將成員函數(shù)抽象出來,那么就用一種方法來表示這種特殊的抽象,這就是純虛函數(shù)。如在上例中,CSubject類,世界上沒有“學(xué)科”這個(gè)科目,所以不應(yīng)該有分?jǐn)?shù)輸出,學(xué)科只是一個(gè)抽象的概念,那么可以用虛函數(shù)來表示它,如:class CSubject/聲明一個(gè)CSubject類public:virtual void display()=0;/聲明一個(gè)純虛函數(shù);純虛函

21、數(shù)只有函數(shù)的名稱而不具備函數(shù)的功能,只是為了派生類的特殊功能保留函數(shù)的名稱。注意:如果在一個(gè)類中聲明純虛函數(shù),而在派生類中卻沒有重新對該函數(shù)進(jìn)行定義,則純虛函數(shù)在派生類中仍然是純虛函數(shù)。純虛函數(shù)的一般形式:virtual 函數(shù)類型 函數(shù)名稱 (參數(shù)列表) = 0;如:virtual void display()=0;純虛函數(shù)是沒有函數(shù)體的,也就是說在基類中不需要對純虛函數(shù)進(jìn)行定義。最后的“=0”并不是表示函數(shù)的返回值為0,它只是起形式上的作用,用來說明這個(gè)虛函數(shù)是純虛函數(shù)。這是一條聲明語句,所以在句子后面有“;”。下面摘錄自:C+程序設(shè)計(jì)教程(修訂版)-設(shè)計(jì)思想與實(shí)現(xiàn) 錢能 (十六章第九節(jié)),

22、來說明虛函數(shù)的一些限制和注意事項(xiàng)。虛函數(shù)的限制一個(gè)類中將所有成員函數(shù)都盡可能地設(shè)置為虛函數(shù)對編程固然方便,Java語言中正是這樣做的,但是會(huì)增加一些時(shí)空上的開銷。對于C+來說,在對性能上有偏激追求的編程中,只選擇設(shè)置個(gè)別成員函數(shù)為虛函數(shù)。設(shè)置虛函數(shù),需注意的事項(xiàng):a) 只有類的成員函數(shù)才能說明為虛函數(shù)。b) 靜態(tài)成員函數(shù)不能是虛函數(shù)。c) 內(nèi)聯(lián)函數(shù)不能是虛函數(shù)。d) 構(gòu)造函數(shù)不能是虛函數(shù)。e) 析構(gòu)函數(shù)可以使虛函數(shù),而且通常聲明為虛函數(shù)。1.4 運(yùn)算符的重載為了解決二個(gè)對象的運(yùn)算問題。只需要定義一個(gè)重載運(yùn)算符函數(shù),在需要執(zhí)行被重載的運(yùn)算時(shí),系統(tǒng)就會(huì)自動(dòng)調(diào)用該函數(shù)。運(yùn)算符的重載相當(dāng)于函數(shù)的重載。

23、格式:函數(shù)類型 operator 運(yùn)算符號 (參數(shù)列表) 對運(yùn)算符的重載處理.格式說明:operator 是關(guān)鍵字專門用來定義重載運(yùn)算符函數(shù)的。函數(shù)聲明:Man operator+(Man &a);函數(shù)定義:Man Man:operator+(Man &a)Man c;c.age=age+a.age;c.height=height+a.height;return c;注意:重載運(yùn)算符的限制(摘錄自:C+程序設(shè)計(jì)教程(修訂版)-設(shè)計(jì)思想與實(shí)現(xiàn))a) C+中不允許用戶定義新的運(yùn)算符,只能對已有對的運(yùn)算符進(jìn)行重載b) 不能改變原有運(yùn)算符操作數(shù)的個(gè)數(shù)c) 不能改變原有運(yùn)算符的優(yōu)先級d) 不能改變原有運(yùn)

24、算符的結(jié)合性e) 不能改變原有運(yùn)算符的語法結(jié)構(gòu)對于C+中的大多數(shù)運(yùn)算符來說都可以進(jìn)行重載,但是“:”、“?”、“:”和“.”運(yùn)算符不能被重載。重載的規(guī)則如下:a) 一元操作數(shù)可以是不帶參數(shù)的成員函數(shù),或者是帶一個(gè)參數(shù)的非成員函數(shù)b) 二元操作數(shù)可以是帶一個(gè)參數(shù)的成員函數(shù),或者是帶二個(gè)參數(shù)的非成員函數(shù)c) “=”、“”、“-”和“()”運(yùn)算符中鞥定義為成員函數(shù)d) “-”運(yùn)算符的返回值必須是指針類型或者能夠使用“-”運(yùn)算符類型的對象e) 重載“+”和“-”運(yùn)算符時(shí),帶一個(gè)int類型參數(shù),表示后置運(yùn)算;不帶參數(shù)表示前置運(yùn)算??截悩?gòu)造函數(shù)和賦值運(yùn)算符的區(qū)別:拷貝構(gòu)造函數(shù)用已存在的對象創(chuàng)建一個(gè)相同的新

25、對象,而賦值運(yùn)算符用已存在的對象賦予一個(gè)已存在的同類對象。1.5 友元的使用友元:可以訪問類的私有成員。友元函數(shù):將普通函數(shù)聲明為友元函數(shù),或者將其他類中的成員函數(shù)聲明為友元成員函數(shù)。定義: friend 函數(shù)定義; 如:friend int max(int a);友元類:將B類聲明為A類的友元,那么B類中所有的函數(shù)都可以訪問A類中的成員。聲明友元類的一般形式:friend 類名;關(guān)于友元的注意事項(xiàng):a) 友元的關(guān)系是單向的,而不是雙向的。如果B類是A類的友元類,不等于A類是B類的友元類,A類的成員函數(shù)不能訪問B類中的私有成員。b) 友元關(guān)系不能傳遞。如果A是B的友元,B是C的友元,并不意味著

26、A是C的友元。c) 友元關(guān)系也不能繼承。如果A是B的友元,C派生于A,并不意味著C是B的友元。d)在實(shí)際工作中,如果沒有必要的話,一般并不將整個(gè)類都聲明為友元。只是將特定的成員函數(shù)聲明為友元,這樣程序更加安全一些。1.6 類模板類模板能夠?yàn)轭惖臄?shù)據(jù)成員、成員函數(shù)的參數(shù)、返回值提供動(dòng)態(tài)參數(shù)化的機(jī)制,使得用戶可以方便地設(shè)計(jì)出功能更為靈活的類。定義格式:template返回值 類名:函數(shù)名(參數(shù)列表) 函數(shù)體內(nèi)容; 示例:類模板中的每個(gè)成員函數(shù)定義都要在前面加上template。templateT Calculate:Add()return m_a + m_b;1.7 this指針this指針是隱含

27、在每個(gè)類成員函數(shù)的指針,其指向正在操作此函數(shù)的類對象。this指針的作用域是類內(nèi)部,當(dāng)在類的非靜態(tài)成員函數(shù)中訪問類的非靜態(tài)成員時(shí),編譯器會(huì)自動(dòng)將對象本身的地址作為一個(gè)隱含參數(shù)傳遞給函數(shù)。二、C/C+程序代碼設(shè)計(jì)規(guī)范2.1 命名規(guī)范類的命名推薦用“名詞”或“形容詞名詞”的形式,如CAnalyzer、CFastVector、IUnknown、IDBWriter、TTimer、TThread等。函數(shù)的名稱由一個(gè)或多個(gè)單詞組成。為了便于界定,每個(gè)單詞的首字母應(yīng)大寫。函數(shù)名應(yīng)使用“動(dòng)詞”或“動(dòng)詞名詞”(動(dòng)賓詞組)的形式,如GetName( )、SetValue( )等。保護(hù)成員函數(shù)的開頭應(yīng)當(dāng)加一個(gè)下劃線

28、“_”以示區(qū)別,如_SetState( )。類似地,私有成員函數(shù)的開頭應(yīng)當(dāng)加兩個(gè)下劃線“_”,如_DestroyImp( )。2.2 表達(dá)式設(shè)計(jì)在C+編程中,表達(dá)式設(shè)計(jì)的一般規(guī)范如下。1) 如果代碼中的運(yùn)算符比較多,用括號確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級。2) 不要編寫過于復(fù)雜的復(fù)合表達(dá)式。3) 不要有多用途的復(fù)合表達(dá)式。4) 不要把程序中的復(fù)合表達(dá)式與“真正的數(shù)學(xué)表達(dá)式”混淆。如(a=b+)!=3,這個(gè)表達(dá)式雖然簡潔,但是過于復(fù)雜,用途多,容易混淆。2.3 條件語句設(shè)計(jì)在C+編程中,條件語句設(shè)計(jì)的一般規(guī)范如下。1) 不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較。 2)

29、 應(yīng)將整型變量用“=”或“!=”直接與0比較。3) 應(yīng)將指針變量用“=”或“!=”與NULL比較,指針變量的零值是“空”(NULL)。盡管NULL的值與0相同,但是兩者意義不同。 4) 在使用switch語句時(shí),每個(gè)case語句的結(jié)尾需要加break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)。 5) 注意最后一個(gè)default分支,即使程序真的不需要default處理,也應(yīng)該保留語句“default : break;”,避免使別人誤以為忘記了default處理。2.4 循環(huán)語句設(shè)計(jì)在C+編程中,循環(huán)語句設(shè)計(jì)的一般規(guī)范如下。1) 在多重循環(huán)中,應(yīng)盡量將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在

30、最外層,以減少CPU跨切循環(huán)層的次數(shù)。 2) 如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很多,應(yīng)將邏輯判斷移到循環(huán)體外面。3) 建議for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”的寫法。2.5 常量設(shè)計(jì)在C+編程中,常量設(shè)計(jì)的一般規(guī)范如下。1) 盡量使用含義直觀的常量來表示那些在程序中多次出現(xiàn)的數(shù)字或字符串。2) 在C+程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。3) 需要對外公開的常量放在頭文件中,不需要對外公開的常量放在定義文件的頭部。為了便于管理,可以把不同模塊的常量集中存放在一個(gè)公共的頭文件中。4) 如果某常量與其他常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而

31、不應(yīng)給出一些孤立的值。 5) 類中的常量不能直接被初始化,只能在類構(gòu)造函數(shù)的初始化表中初始化。2.6 函數(shù)設(shè)計(jì)在C+編程中,函數(shù)設(shè)計(jì)的一般規(guī)范如下。1) 參數(shù)要完整,不能只有參數(shù)的類型而省略參數(shù)名稱,如果函數(shù)沒有參數(shù),用void填充。 2) const修飾函數(shù)參數(shù),對非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),應(yīng)該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效率。對內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const引用傳遞”,否則既達(dá)不到提高效率的目的,又降低了函數(shù)的可理解性。3) 避免函數(shù)有太多參數(shù),盡量控制在5個(gè)參數(shù)以內(nèi)。如果參數(shù)太多,在使用時(shí)容易使參數(shù)類型或順序出錯(cuò)。4) 不要將正

32、常值和錯(cuò)誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯(cuò)誤標(biāo)志用return語句返回。 5) 有時(shí)候函數(shù)原本不需要返回值,但為了增加靈活性,如支持鏈?zhǔn)奖磉_(dá),可以附加返回值。6) return語句不可返回指向“棧內(nèi)存”的指針或引用,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)會(huì)被自動(dòng)銷毀。2.7 注釋規(guī)范良好的代碼注釋有利于增強(qiáng)代碼的可讀性,同時(shí)增加代碼的可維護(hù)性,大大降低軟件的維護(hù)成本。注釋規(guī)范的通則如下。1) 注釋是對代碼的“提示”,而不是文檔,代碼中的注釋不可喧賓奪主,若注釋太多會(huì)讓人眼花繚亂,注釋應(yīng)簡單清晰。2) 如果代碼原本就簡單清晰,則不必加注釋,否則會(huì)顯得多此一舉。 3) 當(dāng)代碼較長,特別是有多重嵌套時(shí)

33、,應(yīng)在一些段落的結(jié)束處加注釋,便于閱讀。三、函數(shù)參數(shù)的傳遞方式3.1 函數(shù)調(diào)用的作用1. 用實(shí)參數(shù)向形式參數(shù)傳遞數(shù)據(jù);2. 為獲得數(shù)據(jù)參數(shù)及在函數(shù)體中聲明的變量分配存儲空間;3. 中斷現(xiàn)行(調(diào)用)函數(shù),把流程向被調(diào)用函數(shù)的入口處,開始執(zhí)行被調(diào)函數(shù)。當(dāng)參數(shù)表為空時(shí),表示該函數(shù)不從調(diào)用函數(shù)接受數(shù)據(jù)。3.2 函數(shù)參數(shù)傳遞機(jī)制 堆棧存儲區(qū)是主調(diào)函數(shù)(過程)和被調(diào)用函數(shù)(過程)在調(diào)用發(fā)生時(shí)進(jìn)行通信的主要區(qū)域。在C+語言中,函數(shù)參數(shù)的傳遞方式主要有二種,分別是值傳遞和引用傳遞(引用和指針)。值傳遞(passl-by-value): 被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,即在堆棧中開辟了內(nèi)存空間以存

34、放由主調(diào)函數(shù)放進(jìn)來的實(shí)參的值,從而成為了實(shí)參的一個(gè)副本。值傳遞的特點(diǎn)是被調(diào)函數(shù)對形式參數(shù)的任何操作都是作為局部變量進(jìn)行,不會(huì)影響主調(diào)函數(shù)的實(shí)參變量的值。引用傳遞(pass-by-reference): 被調(diào)函數(shù)的形式參數(shù)雖然也作為局部變量在堆棧中開辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)函數(shù)放進(jìn)來的實(shí)參變量的地址。被調(diào)函數(shù)對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調(diào)函數(shù)中的實(shí)參變量。正因?yàn)槿绱?,被調(diào)函數(shù)對形參做的任何操作都影響了主調(diào)函數(shù)中的實(shí)參變量。3.3 判斷二種傳遞方式當(dāng)參數(shù)為數(shù)組、指針或引用類型,則此函數(shù)采用的是引用傳遞方式,否則便是值傳遞方式。例子:傳遞指針,void

35、 ValuePass(int* var) 傳遞引用:void ValuePass(int& var)傳遞值: void ValuePass(int var)3.4 引用和取地址的區(qū)別int i;int& Val = i; / 這是一個(gè)引用的定義,Val是i的別名,Val不占任何內(nèi)存和空間,/ 它就是i的聲明。引用在聲明時(shí)必須被初始化,否則出錯(cuò)。i = &Val; / 這是取Val的地址給i3.5 關(guān)于引用的一點(diǎn)迷惑a) 引用可以引用任何數(shù)據(jù)類型,但不能引用數(shù)組,因?yàn)閿?shù)組不是一個(gè)名副其實(shí)的數(shù)據(jù)類型。b) 引用不能引用void,因?yàn)関oid本質(zhì)上不是一個(gè)類型。c) 引用本身不是數(shù)據(jù)類型,所以沒有引

36、用的引用,也沒有引用的指針。四、C/C+中的位運(yùn)算的用法4.1 位運(yùn)算符介紹C語言具有位邏輯運(yùn)算和移位運(yùn)算的獨(dú)特功能,參與位運(yùn)算的運(yùn)算量必須是整數(shù)。位邏輯運(yùn)算包括&(按位與)、|(按位或)、(按位異或)、(取反)四種運(yùn)算,移位運(yùn)算有(右移)兩種運(yùn)算。其中位單目運(yùn)算符。4.2邏輯運(yùn)算4.2.1 & (按位與)參與運(yùn)算的量,如果相對應(yīng)的兩位都為1,則該位的結(jié)果值為1,否則為0,即:0&0=0 0&1=0 1&0=0 1&1=1如:a的值為0x1234,b的值為0x00,a&b運(yùn)算的結(jié)果c應(yīng)為: a 0001 0010 0011 0100 & b 0000 0000 1111 1111 c 0000

37、 0000 0011 0100按位與常用于將某個(gè)運(yùn)算量的某些位清0或提取某些位的值。如上例子,將變量的高8位清0,同時(shí)保留或提取低8位的值,可用一個(gè)高8位為0,低8位為1的值0x00ff和它進(jìn)行按位與。4.2.2 | (按位或)參與運(yùn)算的量,如果相對應(yīng)的兩位都為0,則該位的結(jié)果值為0,否則為1,即:0|0=0 0|1=1 1|0=1 1|1=1如:a的值為0x1234,b的值為0x00,a|b運(yùn)算的結(jié)果c應(yīng)為: a 0001 0010 0011 0100 |b 0000 0000 1111 1111 c 0001 0010 1111 1111 按位或常用于將某個(gè)運(yùn)算量的某些位置1,如本例中將變

38、量的低8位置1,高8位不變,可用一個(gè)高8位為0,低8位為1的值0x00ff和它進(jìn)行按位或。4.2.3 (按位異或)參與運(yùn)算的量,如果相對應(yīng)的兩位相異,則該位的結(jié)果為1,否則為0,即:00=0 01=1 10=1 11=0如:a的值為0x1234,b的值為0x00,ab運(yùn)算的結(jié)果c應(yīng)為: a 0001 0010 0011 0100 b 0000 0000 1111 1111 c 0001 0010 1100 1011 按位異或有“與1異或”該位翻轉(zhuǎn),“與0異或”該位不變的規(guī)律。如本例中用0x00ff進(jìn)行按位異或,使變量a的低8位翻轉(zhuǎn),高8位不變。4.2.4 (取反)將參與運(yùn)算量的相對應(yīng)位的值取反

39、,即1變0,0變1。如:a的值為0x1234,a運(yùn)算的結(jié)果c應(yīng)為: a 0001 0010 0011 0100 c 1110 1101 1100 10114.3 移位操作符4.3.1 (左移)按位左移是將一個(gè)運(yùn)算量的各位依次左移若干位,低位補(bǔ)0,高位舍棄不要。假設(shè)機(jī)器字長為8位,變量a的值為16,將a左移二位,即a=a (右移)按位右移是將一個(gè)運(yùn)算量的各位依次右移若干位,低位被移出,高位對無符號數(shù)補(bǔ)0,對有符號數(shù)要按最高符號位自身填補(bǔ)。右移一位相當(dāng)于該數(shù)除以2,但有可能帶來誤差。假設(shè)機(jī)器字長為8位,變量a值為15,將a右移二位,即a=a2: 右移前 0000 1111 右移后 0000 001

40、1 如果a是帶符號的負(fù)數(shù),a=-16,存放在機(jī)器中的補(bǔ)碼為1111 0000,則a=a2,值為- 4。 右移前 1111 0000 右移后 1111 1100移位操作可用于整數(shù)的快速乘除運(yùn)算,左移一位等效于乘2,而右移一位等效于除以2。五、實(shí)踐筆記const定義了const(常量)類型,const 最初的想法是代替C語言中的#define的。常量名不能放在賦值語句的左邊。常量和變量的區(qū)別常量不能通過常量名去修改其所處的內(nèi)存空間,而變量卻可以。sizeof 它不是函數(shù),也不是運(yùn)算符,用于判斷數(shù)據(jù)類型長度符的關(guān)鍵字。示例:char a = ab cdf; cout sizeof(a) endl;

41、/ 7,注意空格和0int b20 = 0; cout sizeof(b) endl; / 20 * 4 sizeof與 strlen() 區(qū)別:strlen(char*)函數(shù)求的是字符串的實(shí)際長度,它求得方法是從開始到遇到第一個(gè)0結(jié)束。如果你只定義沒有給它賦初值,這個(gè)結(jié)果是不定的,它會(huì)從aa首地址一直找下去,直到遇到0停止。而sizeof() 返回的是變量聲明后所占的內(nèi)存數(shù),不是實(shí)際長度。示例:char str20=; int a = strlen(str); /a=10; strlen 計(jì)算字符串的長度,以結(jié)束符/0為字符串結(jié)束。 int b = sizeof(str); /b=20; s

42、izeof 計(jì)算的則是分配的數(shù)組 str20 所占的內(nèi)存空間的大小,不受里面存儲的內(nèi)容改變。namespace#include 意味著 #include using namespace std;因?yàn)樵跇?biāo)準(zhǔn)化之前不存在名字空間,.h中的所有內(nèi)容都是暴露的。namespace定義只能出現(xiàn)在全局域或另一個(gè)namespace中。每個(gè)編譯單元都有一個(gè)未命名的namespace。通過將變量放入這個(gè)namespace中就可以不必將它們聲明為static的(內(nèi)部聯(lián)接)。C+中要達(dá)到文件內(nèi)的靜態(tài)就使用這種方法。類中聲明的友元也會(huì)進(jìn)入這個(gè)類所在的namespace。using namespace只在當(dāng)前域內(nèi)有效(

43、將namespace中的所有名稱注入當(dāng)前域)。using namespace中引入的名稱可以被覆蓋。比如需要在C+中調(diào)用C的庫中的函數(shù):extern C float f(int a, char b); 否則的話聯(lián)接程序可能無法解析函數(shù)調(diào)用。通常編譯器都會(huì)自動(dòng)處理這種情況。函數(shù)的作用域1. 函數(shù)的聲明和定義默認(rèn)情況下在整個(gè)程序中是extern的.2. 靜態(tài)函數(shù): 函數(shù)前加上statica) 不能被其它源文件所調(diào)用;b) 允許其他源文件建立并使用同名函數(shù)c) 文件作用域(在所用函數(shù)定義之外說明的,其作用域從說明點(diǎn)開始,一直延伸到源文件結(jié)束)下聲明的inline函數(shù)和const常量都默認(rèn)為static存儲類型如加上extern則為外部存儲類型.變量的作用域和生成期:1. 全局變量:函數(shù)外定義的變量a) 由編譯器建立(但定義之前的所有函數(shù)定義不會(huì)知道該變量),默認(rèn)初始化為0;b) 存在于整個(gè)應(yīng)用程序的運(yùn)行期間.c) 其他程序文件中的函數(shù)或本文件中變量定義之前的所有函數(shù)定義需調(diào)用此變量必須在程序文件中提前用extern對該變量進(jìn)行聲明.d) static型只允許在本程序文件中引用;e) 缺

溫馨提示

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

最新文檔

評論

0/150

提交評論