C++編程技術
C++STL程序員開發指南 筆記一
長壽夢 20100430
一、 C與C++的區別
C是一種簡單的語言,它真正提供的只有宏、指針、結構、數組和函數。不管什么問題,C都依賴宏、指針、結構、數組和函數解決。
而C++是C的超集,除此,還有私有保護性成員、函數重載、缺省參數、構造和析構函數、自定義操作符、內聯函數、引用、友元、模板、異常、命名空間等。
C++的核心,是類,即其面向對象的編程思想。
總結十點區別:
(1) 文件擴展名;
(2) 簡化輸入輸出手段;
(3) 數據類型變量的聲明;1.聲明位置任意。2.struct
(4) 動態內存分配符new —delete;
delete [n] 指針名;若n小于定義單元數,實際上仍然釋放完了所有內存空間。
(5) 引用類型;避免拷貝開銷
(6) const 語義的擴展;
1. 一般常量
允許 const int i = 10;在后續的編譯中被直接訪問。例如
const int i = 10;
char t[i];//等效于char[10],在C中編譯錯誤
2. 常指針和常引用-----常參數
多用作函數參數,表示所指對象不能更新。在參數的傳遞過程中不需要執行拷貝構造函數,提高執行效率。
3. 常成員函數(重點掌握哦)
<類型說明符><函數名>(<參數表>) const;
只有常函數才有資格操作常量或常對象,沒有const關鍵字說明的成員函數不能操作常對象。
4. 常數據成員
只能通過構造函數的初始化列表來初始化。
(7) 指針聲明類型與對象類型相一致
void * 可以指向任意類型,但是int * = (int *)(其他類型)
(8) Int和char不再等價
cout << sizeof('A') <<endl;//1
cout << sizeof(65)<<endl;//4
(9) 結構體類型的變化,封裝函數
(10)數組和指針的技術不同
二 、C++存儲技術
存儲類型: extern static register
存取修飾符:const volatie(暫態性)
生存期: 局部 靜態 全局
三、函數技術
1. 構造函數 (分配內存并且初始化)(并非沒有返回值,返回的指向所定義的對象的指針,但不能傳遞)
a. 缺省構造函數
構造函數重載
初始化
a. 如果類存在繼承關系,派生類必須在其初始化表里調用基類的構造函數。例如:
Class A
{A(int x)}
Class B:public A
{B(int x,int y)}
B::B(int x,int y):A(x)//在初始化表里調用A的構造函數
b. 類的const常量只能在初始化表里被初始化,因為它不能在函數體內用賦值的方式來初始化
c. 類的數據成員的初始化可以采用初始化表或函數體內賦值兩種方式,這兩種方式的效率不完全相同。非內部數據成員應采用第一種方式。
2. 析構函數
一個類中只能有一個析構函數;
虛擬析構函數,其目的在于采用動態聯翩方式選擇析構函數。
3. 成員初始化列表
賦值與初始賦值的區別?
賦值操作,是在執行階段向固定存儲單元的變量寫入數值的操作,此后仍允許其他賦值函數修改其內容。
初始賦值,則是對const類的常數僅在編譯時完成預留內存單元同事填入初值,此后不允許再改動。
所以不能在構造函數中使用賦值語句在運行階段對常數或引用類型數據進行賦值。在C++中只有const和引用類型是要在編譯時就要制定其初值的。
類只是抽象數據結構的描述,不分配內存,因此構造函數編譯階段不能完成賦初值工作。
總結:初始化表式專門為這兩種數據類型準備的。
4.常成員函數總結
Const用來臨時設定成員函數的操作特性,凡含有const保留字的成員函數統稱為常數性成員函數,其在類中聲明的格式有3種:
l 防止本函數誤寫參數變量的: 返回值類型 函數名(const 參數,const 參數)
l 防止本函數誤寫類對象的內全部的變量的:返回值類型 函數名(參數表)const
l 防止其他函數誤寫返回地址或引用的:const 返回值類型 函數名(參數表)
5.拷貝構造函數和賦值函數
如果不主動地編寫拷貝構造函數和賦值函數,編譯器默認以“位拷貝”的方式自動生成缺省。若類中還有指針變量,就隱含了錯誤。例如
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.兩次析構
拷貝構造函數和賦值函數的區別:
拷貝構造函數在創建對象時調用。
賦值函數只能被已經存在了的對象調用。比如:
String A(”hello”);
StringB(“world”);
String C=A;//拷貝,等效形式C(A);好的風格應該寫成后者,以區別之。
C=B; //賦值
6.內聯函數
在內聯函數內部允許用循環語句和開關語句;
內聯函數的定義必須出現在內聯函數第一次被調用之前。
7.友元函數
Friend使非成員函數能夠訪問類的私有成員。
四、面向對象機制的實現
相比于C語言的函數,C++增加了重載,內聯,const和virtual四種新機制。其中重載和內聯既可以用于全局函數,又可以用于類成員函數。Const 和virtual僅能用于類的成員函數。
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. 函數重載的技術。
所謂函數重載,是指同一個函數名可以對應多個函數的實現。
要求,參數個數不同或參數類型不同。
3. 多態
封裝、繼承、多態是面向對象程序設計的三大特征,封裝是基礎,繼承是關鍵,多態是補充,而多態又必須存在于繼承的環境之中。
所謂多態性,發出同樣的消息被不同類型的對象接收時導致完全不同的行為。這里所說的消息主要是指對類的成員函數的調用,而不同的行為是指不同的實現。利用多態性,用戶只需發送一般形式的信息,而所有的實現留給接收消息的實現者。
4. 純虛函數和抽象類 技術
純虛函數是一種特殊的虛函數,它的一般格式如下:
Class <類名> {virtual <類型><函數名>(參數表)=0}
把實現留給基類的派生類來做。
帶用純虛函數的類稱為抽象類。抽象類不能定義對象。在實際中,為了強調一個類是抽象類,可將該類的構造函數說明為保護的訪問控制權限。
抽象類的主要作用:將有關內容組織在一個繼承層次結構中,由它來為它們提供一個 公共的根,相關的子類是從這個根類派生出來的 。抽象類刻畫了一組子類操作接口的通用語義。
抽象類只能作為基類使用,其純虛函數的實現由派生類給出。如果派生類沒有重新定義春虛函數,而只是繼承基類的純虛函數,那么這個派生類仍然是一個抽象類,不能直接使用。