類模板和函式模板都是編譯器根據我們呼叫的型別,進行二次編譯生成具體的例項的。類模板的使用實際上是將類模板例項化成乙個類。
c++中可以將模板的思想應用於類,使得類的可以不關注具體所操作的資料型別,而只關注類所需要實現的功能。
c++中的類模板:
提供一種特殊的類以相同的行為處理不同的型別。
在類宣告前使用template進行標識。
< typename t >用於說明類中使用的泛指型別 t。
宣告的泛指型別 t可用於宣告成員變數和成員函式。
編譯器對類模板的處理方式和函式模板相同:
類模板的應用:
使用具體型別定義物件。
**舉例:
#include
#include
using
namespace
std;
template
//類模板
class operator
;template
//修飾成員函式
t operator::add(t a, t b)//要加上
template
t operator::minus(t a, t b)
int main(int argc, char *argv)
類模板中對於定義成員函式的cpp檔案,編譯時發現全都為函式模板,就會只會檢查語法是否正確,不會生成可執行**。等到了要呼叫這個函式的時候,編譯器會第二次編譯這個函式,但是標頭檔案中如果只包含了類定義的內容,沒有包含成員函式的定義,就會呼叫失敗,程式報錯。因此,需要把類中的成員函式的定義和類定義放在一起。
或者,在main檔案中包含成員函式的定義的cpp或hpp檔案,同時在成員函式定義檔案中包含類定義的標頭檔案,這樣就全部被包含了。
#include
"成員函式定義檔案.cpp"
#include
"成員函式定義檔案.hpp"
在模板類外部定義成員函式的實現時,需要加上template < typename t > 的宣告。
舉例說明:
//類陣列模板 類定義 標頭檔案 array.h
#ifndef _array_h_
#define _array_h_
template//定義陣列類
class array
;#endif
//類陣列模板 成員函式定義 標頭檔案 array.hpp
#ifndef _array_def_h_
#define _array_def_h_ //加上巨集保護
#include "array.h" //包含類類定義的標頭檔案
template
array::array(int length)//建構函式,注意 array::
mlength = length;
mspace = new t[mlength];
}template
array::array(const array& obj)//建構函式
template
array::~array() //析構函式
template
t& array::operator(int i)//過載 操作符
template
array& array::operator= (const array& obj)//過載 = 操作符
template
bool array::operator== (const array& obj)//過載 == 操作符 }}
else
return ret;
}template
bool array::operator!= (const array& obj)//過載 != 操作符
#endif
//main檔案 main.cpp
#include
#include
#include "array.hpp" //包含成員函式定義的檔案
using
namespace
std;
int main(int argc, char *argv)
類模板可以被特化:
用template <>宣告乙個類時,表示這是乙個特化類。
特化類模板的意義:
當類模板在處理某種特定型別有缺陷時,可以通過類模板的特化來克服處理這種特定型別帶來的不足。
注意:
編譯器優先選擇特化類生成物件。而且,必須先定義了類模板,然後才能定義類模板的特化。
**舉例:
#include
#include
using
namespace
std;
template
class test
};template
<> //特化
class test
};int main(int argc, char *argv)
自定義工具類01
ftputil ftpclient 工具類 idutils 生成一切id 的策略的工具類。可以使用他生成名稱 jsonutils 物件與json 格式轉換的工具類 public class ftputil 切換到上傳目錄if ftp.changeworkingdirectory basepath f...
抽象類的應用 定義模板
問題定義 假設人分為學生和工人,學生和工人都可以說話,但是學生和工人說話的內容是不一樣的,也就是說說話這個功能應該是乙個具體功能,而說話的內容就要由學生或工人來決定了。可以使用抽象類來實現這個功能。abstract class person public void setname string na...
14 類模板(上)
c 中可以將模板的思想應用與類,使得類可以不關注具體所操作的資料型別,而只關注類所實現的功能。c 中的類模板 提供一種特殊的類以相同的行為處理不同的型別 在類宣告前使用template進行標識 用於說明類中使用的泛指型別t templateclass operator t minus t a,t b...