c++物件導向高階開發(上)
一、c++程式設計簡介
(1)基於物件:只有乙個class的程式設計 object based
物件導向:幾個class的程式設計 object oriented
(2)class的經典分類:
(3)class之間的關係:繼承inheritance、復合composition、委託delegation
(4)學習c++,分為學習c++語言 ,和c++標準庫
(5)c++書籍:語言的書籍《c++primer》第五版,《c++programming language》第四版
提高書籍:《effective c++ third edition》及中文版 《the c++ standard library》《stl原始碼剖析》(stl是標準庫的前身)
二、標頭檔案與類的宣告
(1)標準庫以標頭檔案的形式 存在,只需要include進去就好#include
(2)c語言 #include或者 #include,而 c++: #include或者 #include
(3)標頭檔案的布局:
#ifndef __complex__
#define __complex__
##endif
(4)class的布局:
class header
class body
三、建構函式
(1)inline函式:只要成員函式在class body裡面定義,不需要顯示宣告,就是inline函式,而如果在body之外定義,要想成為inline函式,必須顯示宣告。是否成為inline函式,由編譯器來決定,即使宣告為inline function,也不一定編譯器有能力使之成為inline function。
(2)access level 訪問級別:public ,private ,protected
private:資料的部分用盡量用private
public:函式的部分,大部分用public
(3)建構函式 :建立乙個物件的時候,建構函式自動被呼叫,建構函式可設定默然引數,並用冒號設定引數初始化列表:
pair(const t1& a, const t2& b) : first(a), second(b) {}
引數initializition list和在body裡對引數賦值的區別:乙個是引數初始化;乙個是賦值,是乙個執行的過程,多了計算量;
建立乙個物件,可以有引數,也可以無引數,也可動態建立:complex *p = new complex(4);
class定義了多個建構函式,就是過載overloading
(4)友元函式:
四、引數傳遞和返回值
1、資料放在private裡
2、引數用reference,是否用const
3、返回值用reference傳
4、在類的body裡的函式是否加const
5、建構函式 的 initial list
五、操作符過載與臨時物件
1,、所有的成員的函式帶有乙個隱藏的引數「this」,誰呼叫這個函式誰就是 this
臨時物件 complex() ——》typename();
2、在類外
complex complex::operator+=(complex &c2)
這個是成員函式 operator+= 的實現,所以需要 complex:: ,具有this指標。例如:
inline complex&
complex::operator += (const complex& r)
而下面屬於運算子過載,不是成員函式的時候,就沒有complex:: 。
inline complex
operator - (const complex& x, double y)
六、複習complex類的實現過程
七、三大函式:拷貝構造,拷貝賦值,析構
建構函式
拷貝建構函式
拷貝賦值函式
析構函式
——》只要類帶有指標,就一定需要 拷貝建構函式 和 拷貝賦值函式
淺拷貝——》拷貝建構函式 ,淺拷貝的影響:1、造成記憶體洩漏;2、造成有兩個指標 指向同一塊記憶體
深拷貝——》拷貝賦值函式 步驟:delete ;new; strcpy;
class裡面有預設的拷貝構造和拷貝賦值函式。如果自己不定義乙個拷貝建構函式,在呼叫拷貝建構函式的時候,就會呼叫預設的淺拷貝建構函式,就會造成問題,所以一定要自己定義拷貝建構函式——深拷貝。
八、堆,棧與記憶體管理
1、static local objects的生命週期
static的生命週期 :object的物件在scope結束以後仍然存在,直到整個程式結束;
非static 的生命週期:object的物件在在scope結束以後就結束了。
global objects的生命週期:
物件 objects 生命結束,就是什麼時候析構函式被呼叫:
2、new——》operator new。new動態建立物件,分三步:第一步,先轉化為operator new 函式,申請分配記憶體。第二步,做型別轉化。第三步,呼叫建構函式
delete ——》operator delete。刪除物件,分兩步:第一步,先呼叫析構函式,第二步,再呼叫operator delete函式。
3、帶中括號[ ]的new[ ]叫做array new,帶中括號[ ]的delete[ ] 叫做array delete。
動態分配所得到的陣列array:complex *p = new complex[3];
new ——》delete ——》表示呼叫幾次析構函式
new 字串 ——》delete 指標
delete[n] :array new一定要呼叫array delete,delete[n]會呼叫n次析構函式,而delete僅呼叫一次。
九、複習string類的實現過程
十、擴充套件補充:類模板,函式模板,及其他
(1)static :靜態資料 不屬於某乙個物件,而非靜態的是屬於乙個物件的,這種情況需要設定為靜態資料。
靜態函式 沒有this pointer,而非靜態函式有 this pointer,可以用this去取資料,靜態函式要處理資料只能處理靜態資料。
靜態資料一定要在class外面 定義。
給變數賦值,使獲得記憶體的過程叫定義。
(2)template:類模板 函式模板
(3)namespace:
十 一、復合與繼承
(1)復合composition關係下的構造和析構:構造是由內而外,析構是由外而內 has-a,即先呼叫component的建構函式,再呼叫container的建構函式。
計算記憶體的大小:復合類component的記憶體大小+container的記憶體大小
(2)委託delegation,即composition by reference:在body中宣告乙個 帶指標的 另乙個類 composition by reference
(3)繼承inheritance:(三種繼承方式:public protected private)is-a,繼承主要搭配虛函式來使用
函式的繼承:指的是繼承函式的呼叫權,子類可以呼叫父類的函式。
計算記憶體的大小:先呼叫父類的建構函式,再呼叫子類的建構函式。先呼叫子類的析構,再呼叫父類的析構函式。
十二、虛函式與多型
(1)虛函式:virtual
純虛函式:一定要重新定義。
(2)(a)inheritance + composition下的構造和析構
(b)delegation + inheritance ——》 功能最強大的一種
十三、委託相關設計
C 物件導向高階程式設計 侯捷
1 防禦式宣告 ifndef complex define complex endif 作用 保證只include一次 2 inline function 在body內進行定義 更快,但最終能否inline由編譯器決定 3 為什麼應該用初始化列表 complex double r 0,double ...
C 侯捷 C 物件導向高階開發P1 6
侯捷 c 物件導向開發 動手實現自己的複數類 ifndef complex define complex endif一般情況下,建構函式是要被外界呼叫的,因此不能放在private中,但是有一種設計模式叫做singleton,這個模式將夠著函式放在private中,只允許獲得乙個類例項 class ...
侯捷c 物件導向(上)
一 c 程式設計簡介 1 基於物件 只有乙個class的程式設計 object based 物件導向 幾個class的程式設計 object oriented 2 class的經典分類 class without pointer members e.g complex 複數 class with p...