函式過載: 函式名相同, 引數型別不同, 可以完成具有相似功能的邏輯.
如何實現乙個通用的交換函式呢?
void
swap
(int
* a,
int* b)
void
swap
(char
* a,
char
* b)
void
swap
(double
* a,
double
* b)
使用函式過載雖然可以實現,但是有以下幾個不好的地方:
過載的函式僅僅只是型別不同,**的復用率比較低,只要有新型別出現時,就需要增加對應的函式
**的可維護性比較低,乙個出錯可能所有的過載均出錯
那能否告訴編譯器乙個模子,讓編譯器根據不同的型別利用該模子來生成**呢?
如果在c++中,也能夠存在這樣乙個模具,通過給這個模具中填充不同材料(型別),來獲得不同材料的鑄件(生成具體型別的**),那將會節省許多頭髮。巧的是前人早已將樹栽好,我們只需在此乘涼。
泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎. 可以提高程式設計師的幸福感, 減少程式設計師重複的工作量, 機器自動生成**, 提高工作效率
template
<
typename t>
void
swap
(t* a, t* b)
template
<
typename t>
void
swap
(t& a, t& b)
本身並不會減少實際的**量, 只是把重複的**由機器自動生成
分類:
1. 函式模板:
函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。函式模板不是乙個可以執行/執行的函式, 只有經過例項化產生具體型別的函式**才可以執行
注意:typename是用來定義模板引數關鍵字,也可以使用class(切記:不能使用struct代替class)
注意:在模板中,編譯器一般不會進行型別轉換操作,因為一旦轉化出問題,編譯器就需要背黑鍋, 此時有兩種處理方式:1. 使用者自己來強制轉化 2. 使用顯式例項化
// 可以完成各種型別的處理邏輯, 不需要再寫函式過載了
template
<
classt1,
class
t2>
void
swap
(t1* a, t2* b)
// 加法
template
<
class
t>
t add
(t a, t b)
// 節點
struct node
node
(int a,
int b):_a
(a),
_b(b)};
void
test()
如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。
2. 類模板:
和函式模板一樣, 還是要把具體型別換為抽象型別(帶個帽子)
template
<
class
t>
struct node2
node2
(t a, t b):_a
(a),
_b(b)};
template
<
classt1,
classt2,
classt3,
class
t4>
struct node3
node3
(t1 a, t2 b, t3 c, t4 d):_a
(a),
_b(b),_c
(c),
_d(d)};
void
test3()
template
<
classt1,
classt2,
class
t3>
class
date
void
display()
;// 宣告
private
: t1 _year;
t2 _month;
t3 _day;};
template
<
classt1,
classt2,
class
t3>
// 加帽子
void date
::display()
void
test()
類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
習題:
1.下面有關c++中為什麼用模板類的原因,描述錯誤的是? ( )
a.可用來建立動態增長和減小的資料結構
b.它是型別無關的,因此具有很高的可復用性
c.它執行時檢查資料型別,保證了型別安全
d.它是平台無關的,可移植性
答案: a
a.模板可以具有非型別引數,用於指定大小,可以根據指定的大小建立動態結構
b.模板最重要的一點就是型別無關,提高了**復用性
c.模板執行時不檢查資料型別,也不保證型別安全,相當於型別的巨集替換,故錯誤
d.只要支援模板語法,模板的**就是可移植的
2.下列關於模板的說法正確的是( )
a.模板的實參在任何時候都可以省略
b.類模板與模板類所指的是同一概念
c.類模板的引數必須是虛擬型別的
d.類模板中的成員函式全是模板函式
答案: d
a.不一定,引數型別不同時有時需要顯示指定型別引數
b.類模板是乙個類家族,模板類是通過類模板例項化的具體類
c.c++中類模板的宣告格式為template<模板形參表宣告><類宣告>,並且類模板的成員函式都是模板函式
d.正確,定義時都必須通過完整的模板語法進行定義
3.下列的模板宣告中,其中幾個是正確的( )
1)template
2)template
3)template
4)template
5)template
6)template
7)template
8)a.2
b.3c.4
d.5答案: b
a.1.模板語法錯誤,2.沒有關鍵字class或typename指定型別,3.t2缺少class或typename
b.正確, 4,6,7為正確宣告
c.5.t2缺少class或typename
d.8.缺少template
4.下列描述錯誤的是( )
a.編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎
b.函式模板是乙個藍圖,它本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具
c.模板分為函式模板和類模板
d. 模板類跟普通類以一樣的,編譯器對它的處理時一樣的
答案: d
a.模板是**復用的重要手段
b.函式模板不是乙個具體函式,而是乙個函式家族
c.目前涉及到的模板就兩類,函式模板與類模板
d.模板類是乙個家族,編譯器的處理會分別進行兩次編譯,其處理過程跟普通類不一樣
類模板,模板類和函式模板,模板函式
單整數類 雙整數類 所以c艹跟其他強型別語言為我們提供了乙個所謂模版功能 變數型別 整數 類模板的重點是模板。表示的是乙個模板,專門用於產生類的模子。例子 1 template 2 class vector 3 使用這個vector模板就可以產生很多的class 類 vector vector ve...
函式模板 和類模板
還是例子說話。函式模板 templatemax const t a,const t b 這樣用 int int a 1,b 2 max a,b float float c 1.0f,d 2.0f max c,d double double e 1.0,f 2.0 max e,f 類模板 templa...
函式模板和類模板
1 函式模板 template 形參名,class 形參名,返回型別 函式名 引數列表 其中template和 class 是關鍵字,class 可以用typename 關見字代替,在這裡 typename 和class 沒區別,括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一...