函式模板和類模板

2021-10-07 22:58:07 字數 4121 閱讀 7989

函式過載: 函式名相同, 引數型別不同, 可以完成具有相似功能的邏輯.

如何實現乙個通用的交換函式呢?

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 沒區別,括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一...