C++編程技術(shù)

                                   C++STL程序員開發(fā)指南 筆記一

                                                               長壽夢 20100430

一、             CC++的區(qū)別

       C是一種簡單的語言,它真正提供的只有宏、指針、結(jié)構(gòu)、數(shù)組和函數(shù)。不管什么問題,C都依賴宏、指針、結(jié)構(gòu)、數(shù)組和函數(shù)解決。

                   C++C的超集,除此,還有私有保護(hù)性成員、函數(shù)重載、缺省參數(shù)、構(gòu)造和析構(gòu)函數(shù)、自定義操作符、內(nèi)聯(lián)函數(shù)、引用、友元、模板、異常、命名空間等。

                   C++的核心,是類,即其面向?qū)ο蟮木幊趟枷搿?/span>

        總結(jié)十點(diǎn)區(qū)別

(1)       文件擴(kuò)展名;

(2)       簡化輸入輸出手段;

(3)       數(shù)據(jù)類型變量的聲明;1.聲明位置任意。2.struct

(4)       動態(tài)內(nèi)存分配符new delete

delete [n] 指針名;若n小于定義單元數(shù),實(shí)際上仍然釋放完了所有內(nèi)存空間。

(5)       引用類型;避免拷貝開銷

(6)       const 語義的擴(kuò)展;

1.       一般常量

允許 const int i = 10;在后續(xù)的編譯中被直接訪問。例如

const int i = 10;

char t[i];//等效于char[10],C中編譯錯誤

2.       常指針和常引用-----常參數(shù)

多用作函數(shù)參數(shù),表示所指對象不能更新。在參數(shù)的傳遞過程中不需要執(zhí)行拷貝構(gòu)造函數(shù),提高執(zhí)行效率。

3.       常成員函數(shù)(重點(diǎn)掌握哦)

<類型說明符><函數(shù)名>(<參數(shù)表>) const;

只有常函數(shù)才有資格操作常量或常對象,沒有const關(guān)鍵字說明的成員函數(shù)不能操作常對象。

4.       常數(shù)據(jù)成員

只能通過構(gòu)造函數(shù)的初始化列表來初始化。

(7)       指針聲明類型與對象類型相一致

void * 可以指向任意類型,但是int * = (int *)(其他類型)

8  Intchar不再等價

cout << sizeof('A') <<endl;//1

    cout << sizeof(65)<<endl;//4

9 結(jié)構(gòu)體類型的變化,封裝函數(shù)

10)數(shù)組和指針的技術(shù)不同

 

C++存儲技術(shù)

         存儲類型:  extern         static          register

         存取修飾符:const          volatie(暫態(tài)性)

生存期:    局部          靜態(tài)   全局

 

三、函數(shù)技術(shù)

1. 構(gòu)造函數(shù)  (分配內(nèi)存并且初始化)(并非沒有返回值,返回的指向所定義的對象的指針,但不能傳遞)

   a. 缺省構(gòu)造函數(shù)

   構(gòu)造函數(shù)重載

   初始化

a.       如果類存在繼承關(guān)系,派生類必須在其初始化表里調(diào)用基類的構(gòu)造函數(shù)。例如:

Class A

         {A(int x)}

                   Class B:public A

         {B(int x,int y)}

         B::B(int x,int y):A(x)//在初始化表里調(diào)用A的構(gòu)造函數(shù)

b.       類的const常量只能在初始化表里被初始化,因?yàn)樗荒茉诤瘮?shù)體內(nèi)用賦值的方式來初始化

c.       類的數(shù)據(jù)成員的初始化可以采用初始化表或函數(shù)體內(nèi)賦值兩種方式,這兩種方式的效率不完全相同。非內(nèi)部數(shù)據(jù)成員應(yīng)采用第一種方式。

2. 析構(gòu)函數(shù)

         一個類中只能有一個析構(gòu)函數(shù);

虛擬析構(gòu)函數(shù),其目的在于采用動態(tài)聯(lián)翩方式選擇析構(gòu)函數(shù)。

3. 成員初始化列表

賦值與初始賦值的區(qū)別?

賦值操作,是在執(zhí)行階段向固定存儲單元的變量寫入數(shù)值的操作,此后仍允許其他賦值函數(shù)修改其內(nèi)容。

初始賦值,則是對const類的常數(shù)僅在編譯時完成預(yù)留內(nèi)存單元同事填入初值,此后不允許再改動。

所以不能在構(gòu)造函數(shù)中使用賦值語句在運(yùn)行階段對常數(shù)或引用類型數(shù)據(jù)進(jìn)行賦值。在C++中只有const和引用類型是要在編譯時就要制定其初值的。

類只是抽象數(shù)據(jù)結(jié)構(gòu)的描述,不分配內(nèi)存,因此構(gòu)造函數(shù)編譯階段不能完成賦初值工作。

    總結(jié):初始化表式專門為這兩種數(shù)據(jù)類型準(zhǔn)備的。

4.常成員函數(shù)總結(jié)

  Const用來臨時設(shè)定成員函數(shù)的操作特性,凡含有const保留字的成員函數(shù)統(tǒng)稱為常數(shù)性成員函數(shù),其在類中聲明的格式有3種:

l  防止本函數(shù)誤寫參數(shù)變量的:  返回值類型 函數(shù)名(const 參數(shù),const 參數(shù))

l  防止本函數(shù)誤寫類對象的內(nèi)全部的變量的:返回值類型 函數(shù)名(參數(shù)表)const

l  防止其他函數(shù)誤寫返回地址或引用的:const 返回值類型 函數(shù)名(參數(shù)表)

5.拷貝構(gòu)造函數(shù)和賦值函數(shù)

  如果不主動地編寫拷貝構(gòu)造函數(shù)和賦值函數(shù),編譯器默認(rèn)以“位拷貝”的方式自動生成缺省。若類中還有指針變量,就隱含了錯誤。例如

a.m_a =”hello”;

b.m_b==”world”;

默認(rèn)拷貝為:a.m_a = b.m_b;這將操作三個錯誤:

1. 內(nèi)存泄露: b.m_b內(nèi)存沒有釋放。

2.相互影響。a.m_a 變,b.m_b

3.兩次析構(gòu)

  拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別:

  拷貝構(gòu)造函數(shù)在創(chuàng)建對象時調(diào)用。

賦值函數(shù)只能被已經(jīng)存在了的對象調(diào)用。比如:

String A”hello”;

StringB(“world”);

String C=A;//拷貝,等效形式C(A);好的風(fēng)格應(yīng)該寫成后者,以區(qū)別之。

C=B; //賦值

6.內(nèi)聯(lián)函數(shù)

  在內(nèi)聯(lián)函數(shù)內(nèi)部允許用循環(huán)語句和開關(guān)語句;

  內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。

7.友元函數(shù)

  Friend使非成員函數(shù)能夠訪問類的私有成員。

四、面向?qū)ο髾C(jī)制的實(shí)現(xiàn)

         相比于C語言的函數(shù),C++增加了重載,內(nèi)聯(lián),constvirtual四種新機(jī)制。其中重載和內(nèi)聯(lián)既可以用于全局函數(shù),又可以用于類成員函數(shù)。Const virtual僅能用于類的成員函數(shù)。

1.       類的繼承技術(shù)

a . 單繼承技術(shù)(樹形結(jié)構(gòu))

基類的訪問特性

類的繼承特性

子類的訪問特性

Public

Protected

Private

Public

Public

Protected

No access

Public

Protected

Private

Protected

Protected

Protected

No access

Public

Protected

Private

Private

Private

Private

No access

   b. 多繼承技術(shù)

     使用作用運(yùn)算符::來解決作用域沖突的問題。

2.       函數(shù)重載的技術(shù)。

所謂函數(shù)重載,是指同一個函數(shù)名可以對應(yīng)多個函數(shù)的實(shí)現(xiàn)。

要求,參數(shù)個數(shù)不同或參數(shù)類型不同。

3.       多態(tài)

封裝、繼承、多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)的三大特征,封裝是基礎(chǔ),繼承是關(guān)鍵,多態(tài)是補(bǔ)充,而多態(tài)又必須存在于繼承的環(huán)境之中。

所謂多態(tài)性,發(fā)出同樣的消息被不同類型的對象接收時導(dǎo)致完全不同的行為。這里所說的消息主要是指對類的成員函數(shù)的調(diào)用,而不同的行為是指不同的實(shí)現(xiàn)。利用多態(tài)性,用戶只需發(fā)送一般形式的信息,而所有的實(shí)現(xiàn)留給接收消息的實(shí)現(xiàn)者。

4.       純虛函數(shù)和抽象類 技術(shù)

純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:

Class  <類名> {virtual <類型><函數(shù)名>(參數(shù)表)=0}

把實(shí)現(xiàn)留給基類的派生類來做。

帶用純虛函數(shù)的類稱為抽象類。抽象類不能定義對象。在實(shí)際中,為了強(qiáng)調(diào)一個類是抽象類,可將該類的構(gòu)造函數(shù)說明為保護(hù)的訪問控制權(quán)限。

抽象類的主要作用:將有關(guān)內(nèi)容組織在一個繼承層次結(jié)構(gòu)中,由它來為它們提供一個      公共的根,相關(guān)的子類是從這個根類派生出來的 。抽象類刻畫了一組子類操作接口的通用語義。

抽象類只能作為基類使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類沒有重新定義春虛函數(shù),而只是繼承基類的純虛函數(shù),那么這個派生類仍然是一個抽象類,不能直接使用。