**
問題始於學習資料結構,自己編寫乙個單鏈表,其中用到了過載輸出運算子<<,我寫的大約這樣:
1 template classlist;
後來上網查改為
1 template classlist;
就可以了。不知所以然,查了下《c++ primer》才弄明白。
在類模板中可以出現三種友元宣告:
(1)普通非模板類或函式的友元宣告,將友元關係授予明確指定的類或函式。
(2)類模板或函式模板的友元宣告,授予對友元所有例項的訪問權。
(3)只授予對類模板或函式模板的特定例項的訪問權的友元宣告。
要注意的是,友元函式並非成員函式,是改變了它對類成員的訪問許可權。
(1)沒有什麼好說的,如:
1 template23class
a;
此例中fun可訪問a任意類例項中的私有和保護成員
(2)
1 template23class
a;
這時友元使用與類不同的模板形參,t可以是任意合法標誌符,友元函式可以訪問a類的任何類例項的資料,即不論a的形參是int,double或其他都可以。
(3)
1 template23class
a;
此時fun只有訪問類中特定例項的資料。換句話說,此時具有相同模板實參的fun函式與a類才是友元關係。即假如呼叫fun時其模板實參為int,則它只具有a的訪問許可權。當然friend void fun(t u);中<>中的t可以是任意型別,比如int,double等
回到原問題,按(3)可改為:
template classlist;
按(2)可改為:
1 template classlist;
在這裡其實兩者實現的最終效果一樣的,因為呼叫輸出運算子時需要訪問的類例項的物件是它本身,所以形參t在第一種改法中一定匹配。
模板類的 友元模板函式
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 宣告 ...