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