C++編程技術(shù)
C++STL程序員開發(fā)指南 筆記一
長壽夢 20100430
一、 C與C++的區(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) Int和char不再等價
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),const和virtual四種新機(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ù),那么這個派生類仍然是一個抽象類,不能直接使用。