C 基礎 模板

2021-10-25 08:16:36 字數 3269 閱讀 5729

特化和過載的區別

模板(template)指c++程式設計設計語言中採用型別作為引數的程式設計,支援通用程式設計。c++ 的標準庫提供許多有用的函式大多結合了模板的觀念,如stl以及io stream。模板是c++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。

模板是一種對型別進行引數化的工具,通常有兩種形式:函式模板類模板

使用模板的目的就是能夠讓程式設計師編寫與型別無關的**。

c++只有模板顯式例項化(explicit instantiation),隱式例項化(implicit instantiation),特化(specialization,也譯作具體化,偏特化)。

template

<

typename 形參名,typename 形參名,…>

class 類名

;

template

<

class

t>

class

arrary

;//template class declaration.

函式返回型別 類名模板形參

::函式名(引數列表)

注意:

template

<

class 形參名,class 形參名,...

...>

返回型別 函式名(引數列表)

其中template和class是關鍵字,class可以用typename關鍵字代替,在這裡typename 和class沒區別,<>括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。

template

<

class

t>

void

swap

(t &a, t &b )

;

注意:

// 主模板函式

template

<

typename t,

class

n>

void

func

(t num1, n num2)

// 過載模板函式

template

<

class

n>

void

func

(int num1, n num2)

// 過載模板函式

template

<

class

n>

void

func

(n num1)

模板只有在執行時才會生成相應的例項,會影響執行效率。

編譯器進行型別推導,在編譯期間生成相應的例項

swap<

int>

(a,b)

;

其中是可省的

array<

int> arr;

其中是不可省的

顯式例項化,需要在模板定義後顯式宣告,在編譯期間生成相應的例項。 雖然會增加編譯時間,但提高了執行效率。

注意顯式例項化的寫法:

template

void swap<

int>

(int

&a,int

&b);

template

class

array

<

int>

;//explicit instantiation. 顯式例項化

對於函式模板,只有全特化,不能偏特化。偏特化功能可以通過模板函式的過載實現。

對於類模板,可以全特化、偏特化,但不能過載。(沒有過載類的說法)

c++模板全特化之後已經失去了template的特性。

乙個模板被全特化/偏特化的條件:

必須有乙個主模板類

模板型別被全部/部分明確化

// 主模板

template

<

typename t,

class

n>

void

func

(t num1, n num2)

// 全特化模板

template

<

>

void

func

(int num1,

double num2)

注意全特化類的定義寫法

// 主模板

template

<

typename t,

class

n>

class

test_class};

// 全特化模板

template

<

>

class

test_class

<

int,

double

>

};

注意偏特化類的定義寫法

// 主模板

template

<

typename t,

class

n>

class

test_class};

// 偏特化模板

template

<

class

n>

class

test_class

<

int, n>

};

不能將特化和過載混為一談。全特化和偏特化都沒有引入乙個全新的模板或者模板例項。它們只是對原來的泛型(或者非特化)模板中已經隱式宣告的例項提供另一種定義。

C 模板基礎

在一般情況下,我們進行程式設計的時候就會確定參與運算所有物件的型別,以方便編譯器執行時候及時的分配記憶體,通俗的講也就是讓編譯器明白你要幹什麼,但是很多的時候會有很多尷尬的瞬間,比如舉乙個簡單的例子,現在如果我要對乙個整形的陣列進行排序,我們都知道函式的作用是包裝乙個 塊,方便我們重複呼叫,從而降低...

C 基礎 模板基礎與函式模板

求兩個int float char型別的資料的最大值 c裡面要這樣寫 int maxint int x,int y double maxdouble double x,double y char maxchar char x,char y c 使用函式過載 多個同名函式處理多種型別資料的語法現象 可...

C 基礎 C 模板總結

模板是泛型程式設計的基礎,分為模板函式和模板類 泛型程式設計就是與型別無關的邏輯 是一種復用的方式。那麼為什麼要有泛型程式設計呢?c 是一門強型別的語言,無法像動態語言那樣,可以寫一段邏輯 把任意型別傳進去。為了解決這個問題所以有了泛型程式設計,通過把通用的邏輯設計為模板,可以擺脫型別的限制,提供了...