C 學習日記 12 模板

2021-10-02 06:30:38 字數 3384 閱讀 7190

函式和類有助於使程式更易於編寫,更安全,更易於維護。

然而,雖然函式和類確實具有所有這些優點,但在某些情況下,它們也可能受到c++規則的限制,必須為所有引數指定型別。

例如,你可能想寫乙個函式來計算兩個數字的總和,就像這樣:

int

sum(

int a,

int b)

我們現在可以在我們的main中呼叫兩個整型函式。

int main (

)// 輸出 22

每乙個新函式都需要宣告型別,比如double型

double

sum(

double a,

double b)

如果能編寫乙個能處理任何型別引數的sum()函式,效率會不會更高呢?

函式模板使我們有能力做到這一點!

使用函式模板的基本思想是避免為每個變數指定確切的型別。相反,c ++為我們提供了使用佔位符型別(稱為模板型別引數)來定義函式的功能。

函式模板的定義

要定義函式模板,請使用關鍵字template,然後使用template型別定義:

template

<

class

t>

現在我們可以在函式中使用我們的通用資料型別t:

template

<

class

t> t sum

(t a, t b)

int main (

)// 輸出 22

該函式返回乙個泛型型別t的值,獲取的兩個引數也是型別t。

其他資料型別可以使用相同的函式,例如double型:

template

<

class

t> t sum

(t a, t b)

int main (

)// 輸出 22.66

編譯器自動呼叫相應型別的函式。

多個通用資料型別模板

函式模板還可以處理多個通用資料型別。 使用逗號分隔需定義的資料型別。

讓我們來建立乙個包含多種不同資料型別的引數(乙個int和乙個double)的函式,然後列印乙個較小的值。

template

<

classt,

class

u>

正如你所看到的,這個模板宣告了兩個不同的通用資料型別t和u.

現在我們可以繼續我們的函式宣告:

template

<

classt,

class

u> t smaller

(t a, u b)

(a < b ? a : b)三元運算子用法,檢查aint main (

)// 輸出 69最後輸出是int型的,應為我們在呼叫函式模板的時候宣告了int型函式。

上述例子中的t僅僅只是乙個引數名,type的縮寫。在定義引數的時候你可以取乙個你自己適用的名字。

但是要記住,當你定義了乙個模板引數後,你必須在函式定義中使用它,不然編譯器會報錯。

函式模板總結

類模板定義

就像我們可以定義函式模板一樣,我們也可以定義類模板,允許類使用模板引數的成員作為型別。

使用相同的語法來定義類模板:

template

<

class

t>

class

pair

};

就像函式模板一樣,您可以使用逗號分隔的列表來定義多個通用資料型別。

類的外部定義成員函式

如果您在類的外部定義成員函式,則需要使用特定的語法,例如在單獨的原始檔中。

您需要在類名後面的尖括號中指定泛型型別。

例如,要在類的外部定義乙個成員函式bigger(),使用以下語法:

template

<

class

t>

class

pair

t bigger()

;};template

<

class

t> t pair

::bigger()

要建立不同型別的模板類的物件,請在尖括號中指定資料型別,就像我們在定義類之外的函式時所做的那樣。

在這裡,我們為整數建立乙個pair物件。

pair <

int>

obj(11,

22);cout << obj.

bigger()

;// 輸出 22

我們也可以使用相同的類來定義乙個double型的物件

pair <

double

>

obj(

23.43

,5.68);

cout << obj.

bigger()

;// 輸出 23.43

模板特化 模板特化

要為資料型別char指定不同的行為,我們將建立乙個模板特化。

template

<

class

t>

class

myclass};

template

<

>

class

myclass

<

char

>

};

首先,請注意,我們在模板<>的前面新增了乙個空的引數列表。 這是因為所有型別都是已知的,並且這個特化不需要模板引數,但是仍然是類模板的特化,因此需要注意這一點。

但比這個字首更重要的是類模板名稱之後的特化引數。 這個特化引數本身標識了模板類被特化的型別(char)。

在上面的例子中,第乙個類是通用模板,第二個是特化。

int main (

)/* 輸出:

28 - 不是char型別

5.18 - 不是char型別

w3cschool 是char型別!

*/

正如你所看到的,泛型模板為int和double所呼叫。 但是,我們的模板特化是為char資料型別呼叫的。

請記住,從泛型模板到特化沒有成員「繼承」,所以模板類特化的所有成員都必須自行定義。

1.建立乙個模板類,內容自定

2.宣告三個模板物件物件:i,d,ch,其中i的模板引數是int型,d的模板引數是double型,ch是char型。

前端學習日記12

1 lumn count 3 分欄的數量 2 column gap 50px 欄目和欄目之間的間距 3 column width 500px 欄目的寬度 4 column rule 5px dotted yellow 欄目和欄目之間的邊線 邊框一樣 5 column span all 標題橫跨的列數...

C 學習日記

1611 3 李旗偉 2016年10月5日 連續5天總結 內容a.概括 a 運算子與表示式80 b 流程控制語句45 b.具體內容 在進行了對運算子與表示式的學習後,嘗試了簡單的資料輸入,但結果總是出人預料,自認為會成功的每次運算失敗,搞得我都快失去信心了,還好我知道凡事要堅持,只因心中有夢,才堅持...

C 學習日記

1611 3 李旗偉 2016年10月6日 連續6天總結 內容a.概括 a 程式的基本控制結構95 b 選擇結構60 b.具體內容 以昨天所學為基礎,今日了另乙個世界的學習 流程控制結構。今天,主要學習了程式的基本控制結構,對此已有了基本的認識,並且嘗試了輸入,也小有成績。此外,還對選擇結構進行了淺...