侯捷 C++面向物件高階開發(下)筆記整理
C++面向物件高階開發(下)
一、導讀
(1)泛型程式設計和麵向物件程式設計分屬不同的思維,
(2)由繼承關係所形成的物件模型,包含this指標,vptr指標,vtbl虛表,虛機制,以及虛擬函式造成的多型。
二、conversion function 轉換函式
(1)通過指定關鍵字operator,如operator type() const {} ,並在其後加上轉換的目標型別後,我們就可以宣告轉換函式。轉換函式必須是成員函式,它的宣告不能指定返回型別和引數列表。
分數Fraction型轉換成double型,返回型別不用寫,預設為double型,沒有形參。
三、non-explicit-one-argument constructor
(1)explicit這個關鍵字基本只出現在建構函式前面,意思是需要明確地需要呼叫這個建構函式才能呼叫,不存在暗中、自動的轉換操作。
建構函式兩個引數,第二個引數有個預設值為1;one-argument表示只需要一個實參就可以呼叫該函式
四、pointer-like classes 智慧指標
(1)比指標更高階一些的。C++程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。程式設計師自己管理堆記憶體可以提高了程式的效率,但是整體來說堆記憶體的管理是麻煩的,
(2)智慧指標在C++11版本之後提供,包含在標頭檔案<memory>中,shared_ptr、unique_ptr、weak_ptr
五、function-like classes 仿函式
(1)其實現就是類中實現一個operator(),這個類就有了類似函式的行為,就是一個仿函式類了。
六、namespace經驗談
七、class template 類模板
八、Funtion Template 函式模板
九、Member Template 成員模板
(1)模板裡面再定義模板
十、specialization 模板特化
(1)template <> ——》<>裡面沒有型別的引數了,引數型別在後面繫結,即特化
template <class T> ——》泛化
十一、partial specialization 模板偏特化
(1)emplate <class Allocator>
class vector<bool, Allocator> { //…//};
這個偏特化的例子中,一個引數被繫結到bool型別,而另一個引數仍未繫結需要由使用者指定。
(2)偏特化 分:類模板偏特化、 函式模板偏特化
十二、模板模板引數
(1)模板的引數型別也是模板
(2) template <class T> 和 template <typenameT> ,只有這template <>尖括號裡,class和 typename可以互相替換。typename是後來發展出來的,由於歷史原因,保留著兩種寫法。
十三、關於C++標準庫
(1)容器Container,就是資料結構:陣列,列表,佇列......
(2)演算法Algorithms
十四、三個主題( 和C++11有關)
(1)variadic templates 數量不定的模板引數,即模板引數可變化
例:template <typename T,typename...Types>
(2)auto 編譯器可以指導變數的型別,就在變數前面加上auto
(3)ranged-base for 即for迴圈的新形式
例:for( int i : {1, 2, 3, 4, 5, } ) { }
十五、Reference
(1)變數 佔記憶體,指標變數 int* p = &k,p裡面存放的 k 是地址;
(2)int& r=k;變數r代表k的值,r在宣告的時候一定要有初值。且在此之後,不能再變化,指向其他的變數。
—————————————————————————————————————————
下面講的是物件模型Object Model——》即class和class之間的關係
十六、複合&繼承關係下的構造和析構
(1)Inheritance下的構造和析構 ,從記憶體的角度去分析,子類包含父類的成分和特性,即變數和函式
(2)composition下的構造和析構
(3)Inheritance+composition下的構造和析構
十七、關於vptr和vtbl
(1)多型,
十八、關於this
(1)通過一個物件來呼叫一個函式,那麼物件的地址就是this pointer。
十九、
關於Dynamic Binding 19 (1)
(1)const成員函式,不修改成員變數;
double real () const { return re; }
關於Dynamic Binding
(2)new 建立一個新的物件。
B b;
A a = (A)b;
a.vfunc1();——》通過物件a來呼叫虛擬函式vfunc1(),而不是通過指標來呼叫,屬於靜態繫結,所以呼叫的是A的虛擬函式
A* pa = new B;——》new出來的物件作向上轉型為A ,pa就是this pointer,呼叫的是A的虛擬函式。
pa ->vfunc1();
pa = &b; ——》向上轉型
pa ->vfunc1(); ——》動態繫結;
符合動態繫結的三個條件:a,指標;b,虛擬函式;c,向上轉型;
二十、關於New,Delete
new分解為三個動作malloc ,,delete分解為兩個動作 free 。
(1)new 和delete,
new先分配記憶體,再呼叫建構函式
delete先呼叫解構函式,再釋放memory。
(2)new [ ] 和delete[ ]
二十一、Operator new,operator delete
(1)全域性的過載
過載::operator new 和::operator delete
過載v::operator new [ ] 和 ::operator delete[ ]
(2)在class裡過載
過載::operator new (size_t) 和::operator delete()
過載v::operator new [ ](size_t) 和 ::operator delete[ ] ()
二十二、示例
二十三、過載new(),delete()$示例
二十四、Basic_String使用new(extra)擴充申請量
(1)new有四種:操作符new,operator new ,new[ ](即array new)和 placement new