函式和類有助於使程式更易於編寫,更安全,更易於維護。
然而,雖然函式和類確實具有所有這些優點,但在某些情況下,它們也可能受到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.具體內容 以昨天所學為基礎,今日了另乙個世界的學習 流程控制結構。今天,主要學習了程式的基本控制結構,對此已有了基本的認識,並且嘗試了輸入,也小有成績。此外,還對選擇結構進行了淺...