物件的記憶體布局
系統為每個物件分配一塊棧空間儲存資料成員
每個成員函式都包含乙個隱藏引數(編譯器自動加上的):this指標
(其實可以理解為oc的self)
:黑盒
// 封裝到類中的函式,需要新增static修飾符
:泛性關係
1 靜態多型性:函式過載,運算子過載
2 動態多型性:虛函式
c++中的虛函式的實現一般是通過虛函式表(效率不高,額外佔空間)。
編譯器會為每個有虛函式的類建立乙個虛函式表,該虛函式表將被該類的所有物件共享。類的每個虛成員佔據虛函式表中的一行。如果類中有n個虛函式,那麼其虛函式表將有n*4位元組的大小。
作用:應對變化
virtual 原則:如果某一方法有可能會被子類重寫,那麼這個方法必須要宣告為虛函式
注意:
出現子類的場合都可以用基類替換他
虛函式實現機制
只有有乙個虛函式,就生成虛表
虛表:函式指標(指向成員函式)陣列(資料結構)
有乙個指標vfptr指向這個虛表,每多乙個物件,就有多乙個指標vfptr指向同個虛表
產生派生類後,重寫後(有沒有virtual都一樣),把函式指標指向的函式替換成新函式
過載:乙個函式名多種不同實現(必須在同乙個類裡)
覆蓋:
class csharpe ;
};class circle : public csharpe ;
};
沒有報錯是因為作用域不同
重寫:寫乙個函式,和其中某個函式的函式名,函式返回值,引數都一樣(有沒有const那就不是重寫了,是新加)
class a
};class b : public a
};
b類重寫了a的方法,違反了黎克特制代換原則
可以 設計模式中的單例模式
c c1;
ci.m = 10;
c c2;
c c3;
...
對於乙個類,只有乙個物件,c2 == c3 == c1
不管建立多少次,在記憶體中都只有乙份(只允許存在乙個副本)
在需要繼承的時候,為了防止記憶體洩漏,最好定義成虛函式
方法的集合
乙個類,繼承的除了乙個屬性類,其他都是繼承自需要遵守的協議(協議!!!!)
純虛函式,是必須實現的方法(requish),普通的虛函式 ,可選擇(optional)
簡單工廠模式
// 產品原型,產品,工廠,流水線
觀察者模式
對個觀察者同時監聽某一主題物件,這個主題物件在狀態發生改變時候,會通知所有觀察者物件,使他們能夠更新自己
委託**模式
mvc模式
實戰:簡易計算器的實現
黎克特制代換原則,子類物件一定能代替父類物件的所有行為
依賴倒轉原則,面向介面而不是面向實現
迪公尺特法則,不要呼叫已封裝過的類的東西
單一職責原則,乙個類該幹神馬就做神馬,專心幹一件事
封閉拓展原則,能加就不要改,保留原始增量
OO第二次部落格作業
從第4次作業開始,就進入了多執行緒程式設計的環節。我個人對於多執行緒的理解就是在乙個程式在執行時有多個執行流,能夠實現多個執行緒併發執行的技術。由於能在同一時間內執行多個執行緒,因而能夠提公升計算機的整體處理效能。第五次作業分析 由於第五次作業是我第一次接觸到多執行緒程式設計,因此這次作業對於我來說...
OO第二次部落格總結
第五次作業 度量圖 類圖 分析 這次作業的主要問題是對電梯請求如何分配給三部電梯,讓他們能夠同時工作且不出現問題。這其中涉及到了關於執行緒安全,資料同步的問題。但由於這是多執行緒的第一次作業,自己以前對多執行緒沒有一點概念,做此次作業之前查閱了很多資料,但還是有很多地方並沒有真正弄明白。這在此次作業...
OO第二次部落格總結
一 前言 oo的複雜程度可能和寫完的時間成正比,多項式時週三電工實習不帶電腦,到了計程車已經發展成週三下午5點開始寫readme 不過相比前幾次為語法耗費時間,計程車更多的是為設計來投入精力。多執行緒debug也很有意思,在寫多部電梯時,自己猛然發現除錯時加入的一句system.out.printl...