懶得抄了,直接截圖,後面對模板類友元函式是單個類具體化的友元,還有模板類所有具體化的友元進行自己理解的總結。
總結:
1.模板類的非模版友元函式
友元函式與 t無關時,友元和類的例項化是一對多的關係。即這個友元函式是所有類例項化的友元,可以訪問所有類裡面的成員物件。
友元函式與 t有關時,比如包含t的引數等,指定友元的具體化只是對應具體化類的友元,即一對一的關係,指定具體化友元指定訪問指定具體化類的成員物件。
2.模板類的約束模板友元函式
此種友元函式都要受到模板類型別引數t的影響,即指定友元的具體化只是對應具體化類的友元,是一對一的關係。
3.模板類的非約束模板友元函式
此種此種友元函式不受模板類型別引數t的影響,友元和類的例項化是一對多的關係。
判斷友元和類的例項化是一對一還是一對多關係,最簡單的方式是將模板類具體化幾不同的版本:
如將14.22**具體化和兩個版本
源**template
class hasfriend
~hasfriend()
friend void counts();
friend void reports(hasfriend&);};
版本(即將t替換為int)
class hasfriend
~hasfriend()
friend void counts();
friend void reports(hasfriend&);};
counts()是hasfriend友元,reports(hasfriend&)也是hasfriend的友元
版本(即將t替換為double)
class hasfriend
~hasfriend()
friend void counts();
friend void reports(hasfriend&);};
counts()是hasfriend友元,counts()也是hasfriend的友元
對比發現,counts()是既是hasfriend的友元,也是hasfriend友元,counts()和模板類具體化的友元關係是一對多的關係。
而reports(hasfriend&)只是hasfriend的友元,reports(hasfriend&)也只是hasfriend的友元,是一對一的關係。
既如果友元函式的具體化受到模板類的型別引數t的影響,則模板中的友元函式和類具體化的友元關係是一對多的關係,否則只是一對一的關係。
模板類和友元函式
ifndef mytest h included define mytest h included include template void counts template void result type1 template 成員函式的定義前面才需要加 class hasfriends hasf...
友元與模板類
友元成員函式模板 include using namespace std templateclass a 當用到友元成員函式時,需注意友元宣告與友元定義之間的互相依賴。這是類a的宣告 templateclass b template a的這個t決定了對於b的t型別友元,並且只友元a型別 class ...
友元函式和友元類
友元函式和友元類 採 用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。但是,有時需要定義一 些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式外,還有友元類...