模闆初階
- 1.泛型程式設計
-
- 1.1實作一個通用的交換函數(函數重載)
- 1.2引入泛型程式設計
- 2.函數模闆
-
- 2.1函數模闆概念
- 2.2函數模闆格式
- 2.3函數模闆原理
- 2.4函數模闆的執行個體化
-
- 2.4.1隐式執行個體化
- 2.4.2顯式執行個體化
- 2.5模闆參數的比對原則
- 3.類模闆
-
- 3.1類模闆的定義格式
- 3.2類模闆的執行個體化
1.泛型程式設計
1.1實作一個通用的交換函數(函數重載)
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
- 雖然可以用函數重載實作,但是也有缺點:
-
重載的函數僅僅隻是類型不同,代碼的複用率比較低,隻要有新類型出現時,就需要增加對應的函數
-
代碼的可維護性比較低,一個出錯可能所有的重載均出錯
1.2引入泛型程式設計
- 如果在C++中,也能夠存在這樣一個模具,通過給這個模具中填充不同材料(類型),來獲得不同材料的鑄件(生成具體類型的代碼),那将會節省許多的時間,提高了效率。
- 泛型程式設計:編寫與類型無關的通用代碼,是代碼複用的一種手段
2.函數模闆
2.1函數模闆概念
- 函數模闆代表了一個函數家族,該函數模闆與類型無關,在使用時被參數化,根據實參類型産生函數的特定類型版本
2.2函數模闆格式
2.3函數模闆原理
- 函數模闆是一個藍圖,它本身并不是函數,是編譯器用使用方式産生特定具體類型函數的模具。是以其實模闆就是将本來應該我們做的重複的事情交給了編譯器
- 在編譯器編譯階段,對于模闆函數的使用,編譯器需要根據傳入的實參類型來推演生成對應類型的函數以供調用。
- 比如:當用double類型使用函數模闆時,編譯器通過對實參類型的推演,将T确定為double類型,然後産生一份專門處理double類型的代碼,對于字元類型char也是如此
2.4函數模闆的執行個體化
2.4.1隐式執行個體化
- 隐式執行個體化:編譯器根據實參進行自動推導,産生直接可執行的代碼
2.4.2顯式執行個體化
- 顯式執行個體化:函數名 + <類型> +(參數清單)
- 如果類型不比對,編譯器會嘗試進行隐式類型轉換,如果無法轉換成功編譯器将會報錯。
2.5模闆參數的比對原則
- 注意: 模闆函數不允許自動類型轉換,但普通函數可以進行自動類型轉換
3.類模闆
3.1類模闆的定義格式
3.2類模闆的執行個體化
- 類模闆執行個體化與函數模闆執行個體化不同,類模闆執行個體化需要在類模闆名字後跟< >,然後将執行個體化的類型放在< > 中即可,類模闆名字不是真正的類,而執行個體化的結果才是真正的類
- 拿一個日期類來舉例子,上代碼