C++編程技術

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

                                                               長壽夢 20100430

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

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

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

                   C++的核心,是類,即其面向對象的編程思想。

        總結十點區(qū)別

(1)       文件擴展名;

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

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

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

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

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

(6)       const 語義的擴展;

1.       一般常量

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

const int i = 10;

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

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

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

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

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

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

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

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

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

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

8  Intchar不再等價

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

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

9 結構體類型的變化,封裝函數(shù)

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

 

C++存儲技術

         存儲類型:  extern         static          register

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

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

 

三、函數(shù)技術

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

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

   構造函數(shù)重載

   初始化

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

Class A

         {A(int x)}

                   Class B:public A

         {B(int x,int y)}

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

b.       類的const常量只能在初始化表里被初始化,因為它不能在函數(shù)體內用賦值的方式來初始化

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

2. 析構函數(shù)

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

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

3. 成員初始化列表

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

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

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

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

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

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

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

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

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

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

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

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

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

a.m_a =”hello”;

b.m_b==”world”;

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

1. 內存泄露: b.m_b內存沒有釋放。

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

3.兩次析構

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

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

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

String A”hello”;

StringB(“world”);

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

C=B; //賦值

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

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

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

7.友元函數(shù)

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

四、面向對象機制的實現(xiàn)

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

1.       類的繼承技術

a . 單繼承技術(樹形結構)

基類的訪問特性

類的繼承特性

子類的訪問特性

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. 多繼承技術

     使用作用運算符::來解決作用域沖突的問題。

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

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

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

3.       多態(tài)

封裝、繼承、多態(tài)是面向對象程序設計的三大特征,封裝是基礎,繼承是關鍵,多態(tài)是補充,而多態(tài)又必須存在于繼承的環(huán)境之中。

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

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

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

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

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

帶用純虛函數(shù)的類稱為抽象類。抽象類不能定義對象。在實際中,為了強調一個類是抽象類,可將該類的構造函數(shù)說明為保護的訪問控制權限。

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

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