程式設計中,會遇到這樣的問題:程式實體所要完成的功能完全一樣,但是它們所操作的資料型別卻不一樣。對於這些函式或者類,採用乙個函式和乙個類來進行描述的話,將會大大簡化程式設計的工作。
比如求最大值max()的實現:有int、int ; double、double ; float、float……需要定義多個函式。但是這些函式的實現,除了資料型別不同,其他都相同。使用函式模板可以簡化程式。
template//也可以使用templatet max(t a, t b)
有了函式模板,那麼在使用類的時候,成員函式、友元函式如何使用函式模板呢?這就需要類模板。
//表示矩陣,可以自定義行列數,值可以是不同資料型別
templateclass matrix ;
宣告一系列泛型,僅作用與之後的乙個函式,在不同函式中,與名稱t無關,代表不同的含義。
除了宣告型別,還可以宣告數值
template
基本上可以與class互換。因為使用class易混淆,故引入typename。
與class不同的是,typename可以告訴編譯器其後是型別名。常在巢狀依賴型別(nested depended name)中使用,簡化表達。
//巢狀依賴型別
templateclass text1
;templateclass test2
;//呼叫語句
test2> n;
定義類模板可以在成員友元函式中使用泛型,簡化程式。同函式模板使用基本相同。不同的是,在類的使用時,定義物件(例項化)的時候需要顯示寫出泛型。如上例
//呼叫語句
test2> n;
體內實現時和普通類一樣
體外實現時宣告同普通類一樣,定義時要加上泛型宣告。
體內實現時要加上泛型宣告(一處)。
體外實現時宣告和定義時都要加上泛型宣告(兩處)。
但是體外實現可移植性較差,vs可使用,gcc系列編譯器和linux都不支援這種寫法。故友元函式最好寫成體內實現形式。
而友元函式不能體外實現的原因也很簡單。上文提到template泛型宣告僅作用於乙個函式,與typename泛型名相同與否無關。故友元函式體外實現時,編譯器看來就是另乙個使用模板的函式,與類宣告的泛型無關。在呼叫函式的時候,該函式無法知道如同定義時顯示寫出的泛型。而友元宣告本身只是允許訪問私有成員。故無法體外實現。vs對其進行了特殊處理。
舉例:
templateclass matrix
//體外實現 宣告
~matrix();
//友元函式 體內實現
friend istream& operator>>(istream& in, matrix& s) };
//成員 體外 定義
templatematrix::~matrix()
//呼叫
int main()
模板類的 友元模板函式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 include include usingnamespacestd template classt c...
模板類的 友元模板函式
模板類的 友元模板函式 第二名 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 include include usingnamespacestd te...
友元(友元函式 友元類 類成員函式的友元)
friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...