C 入門之模板基礎講解

2022-09-25 03:18:06 字數 2662 閱讀 8156

目錄

今天博主將要介紹的內容是–模板,他在c++中具有非常重要的位置.至於什麼是模板呢?我們請看下面的章節.

我們對交換函式swap已經非常熟悉了,但是我們經常會遇到這樣的一些事,比如,很多不同的資料型別進行交換,那麼我們就需要寫不同的過載swap,如下:

#include

using namespace std;

void swap(int& a,int& b)

void swap(double& a,double& b)

int main()

可gketqze以看到,如果有必要,我們需要交換幾種型別的資料,就必須寫上幾種過載swap,這就導致非常的繁瑣,因為我們對其交換邏輯太熟悉了,只是換了變數型別,那有什麼辦法可以解決呢?沒錯,這就是我們今天要講的模板.

概念:在生活中,博主舉乙個例子,假設你是乙個手辦廠家,現在你需要售出各種材料和顏色做的悟空手辦,首先你需要的就是悟空的模型,然後按照這個模型使用不同的材料.這個模型就是我們在程式中的模板.

模板種類:

函式模板的格式:

template

return_val function_name (para1,para1,...)

打省略號的都是形參列表,表示參數量自由,我們現在知道了怎樣使用函式模板,那試試寫乙個swap模板:

template

void swap (t& a,t& b)

按照模板規範,我們寫出來了swap的模板,現在測試一下結果是否正確呢?

發現測試結果完全正確.

然後這裡博主有個疑問,就是我們呼叫swap時,編譯器是執行的上面模板呢?還是執行的通過模板推演出來的函式呢?

答:通過模板推演出來的函式,因為c++提出模板是為了節省程式設計師的時間,我們所省略的工作,只是編譯器替我們完成了.

也就是說,比如我們這樣呼叫:

int main()

那麼編譯器在底部會推演出乙個如下函式,並執行:

void swap(int& a,int& b)

什麼叫做模板的匹配原則呢?

就是說當既有定義出來的明確函式,同時又有模板,那麼呼叫函式時候,執行的是哪乙個?以下面為例:

void swap(int& a,int& b)

template

void swap (t& a,t& b)

int main()

匹配順序為:

也就是說,上面的例子中,swap呼叫的是我們定義出來的swap,而不是模板.

上面講解的模板使用,其實被稱做隱式呼叫,現在,博主介紹一下顯示呼叫.

顯示呼叫格式:

function(para1,para1,...);

也就是說,我們明確知道需要使用的什麼型別,並且就想告訴編譯器,我傳給你的是什麼型別,然後讓編譯器推演出該型別的函式.比如下面使用:

int a = 10,b = 20;

char c = 'a',d = 'b';

swap(a,b); //告訴編譯器我傳的是int型別

swap(c,d); 告訴編譯器我傳的是char型別

大家可能會問了,這有什麼用呢?既然編譯器會根據我們的呼叫情況進行推演,還進行顯示呼叫不是多此一舉嗎?大家請看下面的**:

template

void swap (t& a,t& b)

int main()

像上面的呼叫方式,是不允許的,因為模板中只有乙個t,但是我們傳了兩個型別,編譯器根據模板將不知道t應該是啥型別,而解決上面的問題只有兩種

其次,博主講解模板的顯示呼叫還有乙個目的就是為了引出下面的類模板.

類模板和函式模板相似,定義框架如下:

template

class class_name

;我們對資料結構—棧,應該算比較了解,而對於經常刷力扣的夥伴來說,可能會發現棧不只是用來儲存int型別,比如還有listnode*等,那我們大概寫一下其stack模板吧.

template

cl stack

~stack()

void push(t& a)

{}private:

t* data;

int top;

int capacity;

};然後我們定義stack物件,但是物件應該儲存的型別是什麼呢?如果我們繼續用最開始的隱式模板方法,發現完全實現不了,這也就是博主上面為何要講解模板的顯示呼叫,因為類模板只能通過顯示呼叫實現,例子使用如下:

stack st1; //定義乙個儲存char型別的棧

stack st2; //定義乙個儲存int型別的棧

stack st3; //定義乙個儲存double型別的棧

stack並不是類,其只是乙個模板,stack 等才是類

類模板只是乙個模板,他並不屬於類.

當我們的模板類中的成員函式,在模板中宣告,而在模板外定義時,需要加上模板引數列表,如下:

template

class stack

;template

void stack:: pu程式設計客棧sh(t& a) //需要加上template ,且在stack後面加上

{}template

void stack:: empty() //需要加上template ,且在stack後面加上

{}本文標題: c++入門之模板基礎講解

本文位址:

C 入門講解

使用c 語言程式設計時,需要用到各種變數來儲存各種資訊,變數保留的是它所儲存的值的記憶體位置,在設計c 語言時,根據儲存的資訊大小將儲存的資料分為不同的型別 節省記憶體空間 這樣作業系統就能夠根據變數型別,來分配記憶體和決定在保留記憶體中儲存資訊。在c 語言的設計中內建了七種基礎資料型別 布林型 b...

c 基礎之模板函式

如果現在需要定義乙個通用的加法函式。我們首先會想到函式過載 即針對每個所需相同行為的不同型別,重新實現它 include using namespace std int funtest1 const int left,const int right float funtest2 const floa...

C 入門基礎 十 模板 類模板 模板函式總結

emsp有句話是這麼說的 世界是由懶人創造的,在我們的計算機世界中同樣如此。我們之前說到,為了將同乙個功能的實現簡單化,我們學習了過載的相關知識,但是過載也有乙個缺陷,就是需要將不同型別的變數所對應的函式一 一寫出,就比如我們想要實現兩個數的交換,那麼問題來了,這個數有int double char...