類模板友元函式的實現(綜述)(入門)

2021-10-06 13:55:26 字數 1516 閱讀 6968

程式設計中,會遇到這樣的問題:程式實體所要完成的功能完全一樣,但是它們所操作的資料型別卻不一樣。對於這些函式或者類,採用乙個函式和乙個類來進行描述的話,將會大大簡化程式設計的工作。

比如求最大值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 宣告 ...