模板是泛型程式設計的基礎,分為模板函式和模板類
泛型程式設計就是與型別無關的邏輯**,是一種復用的方式。
那麼為什麼要有泛型程式設計呢?
c++是一門強型別的語言,無法像動態語言那樣,可以寫一段邏輯**,把任意型別傳進去。為了解決這個問題所以有了泛型程式設計,通過把通用的邏輯設計為模板,可以擺脫型別的限制,提供了繼承機制以外的又一種抽象機制,提公升了**的復用性
注意:模板不參與編譯,是編譯器根據使用者使用時提供的型別引數生成**,這個過程叫做模板的例項化,模板又分為模板函式和模板類。
模板可以使我們生成通用的函式,這個函式可以接受任意型別的引數,也可以返回任意型別的值,不需要對所有可能的型別進行函式過載,這在一定程度實現了巨集的作用。
函式模板的格式:
template返回值 函式名(引數列表)
模板中形參的定義可以使用class,也可以使用typename,含義是相同的。
如下**:
templatebool isequal(const t& left, const t& right )
void test()
實現了乙個模板isequal函式,用來比較兩個t型別的資料是否相等,輸出結果是0 1 1
三次呼叫isequal函式,每次引數的型別都不同,但是卻都可以比較,這就是模板的作用,乙份**可以適用任意型別
1.模板函式的例項化
編譯器呼叫模板函式時,編譯器會根據函式傳遞的引數自動推演出模板引數的型別,並自動生成對應的**
如圖,編譯器呼叫isequal(s1, s2)時就會自動推演出乙份形參為string的**,下面也是同樣的道理
彙編**如下:
2.模板引數匹配
寫一行這樣的**的時候:
沒有與引數列表匹配的函式模板示例,所以模板引數一定要匹配,不能亂寫導致不匹配,不能例項化出**
3.顯示例項化
cout << isequal(1, 1.2);
cout << isequal(1, 1.2);
上面的isequal函式中兩個形參的型別是不同的,但時編譯器卻沒有報錯,原因是對模板進行了顯示例項化
顯示示例化是手動的例項化乙份**,型別在函式後面指定,然後直接使用顯示例項化出的**
第一行中1.2被型別轉換為整數,第二行是1被轉換為浮點型數了
4.過載函式模板
templatebool isequal(const t& left, const t& right )
bool isequal(const int& left, const int& right)
templatebool isequal(const t1& left, const t2& right)
void test()
如上**,模板函式有乙個int型別的例項化版本,也有乙個兩個形參不同版本的模板
類模板是用來生成類的藍圖的,與函式模板不同的是,編譯器不能為類模板自動推演模板引數的型別,所以使用類模板的時候必須在模板名後面的尖括號中提供額外的資訊。
類模板的格式:
templateclass 類名
寫乙個簡單的模板類:
templateclass testclass
protected:
t val[2];
};
如果我們定義乙個類物件,想讓這個物件儲存兩個整型資料,可以這樣寫:
testclasst(1, 2);
類模板使用時需要顯示的例項化,就像上面這樣。
如果想要在類外面定義類的成員函式 ,必須在每個函式前面加上template<...>
templateclass testclass
protected:
t val[2];
};templatet testclass::getmaxval()
注意這個函式:
templatet testclass::getmaxval()
有乙個template<...>和函式,和普通的類外定義成員函式類似,加上函式屬於的類域,這裡的函式頭部的t是返回值 C 模板總結
1 模板概念 模板是泛型程式設計的基礎。所謂泛型程式設計就是編寫與型別無關的邏輯 是一種復用的方式。模板分為模板函式和模板類。2 typename 與 class template 採用 class 來宣告模板 class template 採用 typename 來宣告模板 class 這兩種一般...
C 模板總結
前提 我們要實現乙個通用的交換函式swap,就是讓它適用於任何乙個型別。比如 int,char,double.但是我們要寫很多交換的函式,對swap函式進行過載。那我們如何解決這個問題?可不可以給編譯器乙個模子,讓編譯器來給我們實現不同型別的轉化?1.概念 函式模板代表了乙個函式家族,在使用時被引數...
C 模板基礎
在一般情況下,我們進行程式設計的時候就會確定參與運算所有物件的型別,以方便編譯器執行時候及時的分配記憶體,通俗的講也就是讓編譯器明白你要幹什麼,但是很多的時候會有很多尷尬的瞬間,比如舉乙個簡單的例子,現在如果我要對乙個整形的陣列進行排序,我們都知道函式的作用是包裝乙個 塊,方便我們重複呼叫,從而降低...