Boolan-C++開發工程師-泛型編程-第一周筆記

C++泛型編程

1. Conversion function轉換函數


圖中,黃色部分即為轉換函數,轉換函數不需要加返回類型,不需要調用參數,通常加const。轉換函數的作用就是在需要以另外的類型使用一個對象時,自動的將該對象轉換為該類型。

如上圖的實例測試所示,自動的將Fraction型對象f轉換為double類型。

2. non-explicit-one-argument ctornon-explicit的單實參構造函數


上圖中的綠色部分為該類的構造函數,可以以單實參的形式調用。在語句Fraction d2=f+4中,f只能與Fraction對象相加,編譯器就自動的把4轉為Fraction(4,1)。

注意:在需要起碼兩個實參的構造函數中,不會自動完成該轉換。

注意:當轉換函數和non-explicit單實參構造函數同時存在時,語句d2=f+4會報錯,因為編譯器不知道是調用轉換函數還是調用構造函數。但如果在構造函數前面加聲明符explicit的話,構造函數將不會被隱式調用。

3. pointer-like classes,像指針的類

用類來模擬指針的行為,這樣能實現指針的功能,能像指針一樣使用,但同時也能實現更多的功能。比如智能指針shared_ptr、迭代器iterator都是像指針的類。

4. function-like classes,仿函數

仿函數最大的特征就是對operator()進行重載,這樣調用“類名()”這樣的語句時,會使其像函數一樣被調用,但實際上是調用了類中的operator()。

下圖就是STL中的部分仿函數。


仿函數都會繼承這樣一個base classes:


5. namespace命名空間

這個沒什么好談了,就是個命名空間而已,防標識符沖突用的。

6. classes template,類模板

這個簡單,不說了,自己看圖體會。


7. function template,函數模板

這個也簡單,看圖體會

8. member template,成員模板

就是模板中的模板,一般用于繼承關系中,可以使用子類來構造父類

9. specialization,模板特化

泛化的反義詞,在模板中,該模板針對某一特定類型具有與其他類型不一樣的實現時,使用特化。

該模板中,針對char、int、long具有不同的實現,所以對這三個類型分別寫了特化模板。

10. partial specialization,偏特化

分為兩種:

個數的偏:模板里面具有1個以上的泛化類型,只對其中的部分泛化類型進行特化。

范圍的偏:比如對指針類具有不同的實現,那么針對指針類型寫另一個泛化模板,這就是范圍的偏。

11. template template parameter,模板模板參數

這個不知道怎么講,自己不會很理解,感覺很少用,就放個圖自己體會吧。

注意:對于STL的容器,在使用時諸如vector,看似vector只需要一個參數,實際上容器大多都有多個參數,只是除了第一個參數之外都有默認值。

12. variadic templates,數量不定的模板參數

自己可以寫個代碼實現一下圖中的內容,寫一下就理解了。

13. auto

這個就不講了吧,C++基礎知識

14. ranged-base for,范圍for循環

這個也是,一般含有C++11的書里面都有提到,基礎知識。

15. reference

C++相比于C的一個比較大的新東西。

reference通常不用于聲明變量,而是用于函數參數類型和返回類型的描述。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容