1. 程式人生 > >侯捷 C++面向物件高階開發(下)筆記整理

侯捷 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++程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。程式設計師自己管理堆記憶體可以提高了程式的效率,但是整體來說堆記憶體的管理是麻煩的,

C++11中引入了智慧指標的概念,方便管理堆記憶體。

(2)智慧指標在C++11版本之後提供,包含在標頭檔案<memory>中,shared_ptrunique_ptrweak_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