關於類模板的友元函式

2022-05-01 03:27:06 字數 1041 閱讀 3138

**

問題始於學習資料結構,自己編寫乙個單鏈表,其中用到了過載輸出運算子<<,我寫的大約這樣:

1 template  class

list;

後來上網查改為

1 template  class

list;

就可以了。不知所以然,查了下《c++ primer》才弄明白。

在類模板中可以出現三種友元宣告:

(1)普通非模板類或函式的友元宣告,將友元關係授予明確指定的類或函式。

(2)類模板或函式模板的友元宣告,授予對友元所有例項的訪問權。

(3)只授予對類模板或函式模板的特定例項的訪問權的友元宣告。

要注意的是,友元函式並非成員函式,是改變了它對類成員的訪問許可權。

(1)沒有什麼好說的,如:

1 template23

class

a;

此例中fun可訪問a任意類例項中的私有和保護成員

(2)

1 template23

class

a;

這時友元使用與類不同的模板形參,t可以是任意合法標誌符,友元函式可以訪問a類的任何類例項的資料,即不論a的形參是int,double或其他都可以。

(3)

1 template23

class

a;

此時fun只有訪問類中特定例項的資料。換句話說,此時具有相同模板實參的fun函式與a類才是友元關係。即假如呼叫fun時其模板實參為int,則它只具有a的訪問許可權。當然friend void fun(t u);中<>中的t可以是任意型別,比如int,double等

回到原問題,按(3)可改為:

template  class

list;

按(2)可改為:

1 template  class

list;

在這裡其實兩者實現的最終效果一樣的,因為呼叫輸出運算子時需要訪問的類例項的物件是它本身,所以形參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 宣告 ...