模板類和友元

2021-07-29 08:37:21 字數 1878 閱讀 7757

懶得抄了,直接截圖,後面對模板類友元函式是單個類具體化的友元,還有模板類所有具體化的友元進行自己理解的總結。

總結:

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 ...

友元函式和友元類

友元函式和友元類 採 用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。但是,有時需要定義一 些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式外,還有友元類...