c++学习笔记之模板
生活随笔
收集整理的這篇文章主要介紹了
c++学习笔记之模板
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、函數模板
template<typename T> void name (T ...)
其中typename也可以換成class。
(1)可以多參template<class T1, class T2>
(2)模板中形參名可以不必是唯一的。
(3)如果調用了一個帶用戶自定義類型的模板,并且該模板用到了函數或運算符,那么這些函數和運算符必須被這個用戶定義類型重載,否則運行出錯
(4)如果一個普通函數和一個函數模板特化跟調用函數匹配度相同,那么這個普通函數會被調用。
2、類模板
也叫參數類型。 template<typename T> class A {...}
使用: A<int> a;
(1)類模板的成員函數的定義就是函數模板,所以出現在類模板定義外的成員函數的定義一定要加template,如:
template<typename T> void A<T>::B(...)
(2)類模板的所有成員函數必須在頭文件中實現,不能在.cpp文件中實現。否則調用這個函數時會報錯“無法解析的外部符號”
3、非類型參數和默認類型參數
非類型參數(在類中可以使用) ?template<typename T, int i>
默認類型參數 ? ? ? ? ? ? ? ? ? ? ? ? ? template<typename T = string>
(1)有默認類型參數,使用時可以直接 A<> a 等同于 A<string> a
(2)默認類型參數必須在模板參數列表最右側(尾部)。
當有多個默認類型參數,其中一個不在最右側,那么該參數右邊所有的參數都會被忽略。
注意這里與默認實參不同,默認實參不在最右側會報錯,而默認類型參數則不會。
4、顯示特化
如果一個特定的用戶定義類型不能使用類模板或者需要有特定的處理,那么久可以為這個特定類型定義一個現實的類模板特化。
template<> class A<Employee> {...}
新類會對原模板完全覆蓋,它沒有使用原來類模板的任何內容甚至可以包含不同的成員。
5、模板與繼承
類模板可以從類模板特化派生得到
類模板可以從非類模板類派生得到
類模板特化可以從類模板特化派生得到
非類模板類可以從類模板特化派生得到
6、模板與友元
假設模板template<typename T> class X
友元1: friend void f1() ? ? ? 是X<double>,X<int>,X<...>等的友元
友元2:friend void f2(X<T> &) ? 那么f2(x<float> &)只是X<float>的友元
(1)可以將一個類的成員函數聲明為一個類模板的友元,如:
friend void A::f3() ? ? ? ? ? ?類A的f3函數是友元
7、模板和靜態成員
每一個由相同類模板實例化產生的類模板特化都有它自己的類模板靜態數據成員的副本。
一個模板類特化產生的所有對象都共享一個靜態數據成員。
每個類模板特化都得到一份屬于自己的類模板靜態成員函數的副本。
?
?
?
總結
以上是生活随笔為你收集整理的c++学习笔记之模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中四种线程池及poolSize、
- 下一篇: c++学习笔记之输入/输出流