c++98的friend
參見很久以前的隨筆《友元》
c++11擴充套件的friend
直接用**說明,示例如下:
1class
poly;
2typedef poly p; 34
class
lilei 5;
89class
jim 10;
1314
class
hanmeimei
15;
宣告了3個型別:lilei、jim和hanmeimei,它們都有乙個友元型別poly。
主要兩點:
[1] 宣告乙個類為另外乙個類的友元時,不再需要使用class關鍵字
[2] 宣告友元類時,甚至可以使用類的別名。
下面,主要分析一下應用變化:
(1)普通類a 的 普通類b友元(一對一友好關係):
無需前置宣告class b,當class b第一次出現在friend宣告中時,該類名字被隱式地認為可見。
1classa2
;78classb9
1516
private:17
intm_b;
18 };
(2)如果普通類a的友元是乙個例項化的特定模板,那麼這個具體例項化的類在被宣告為友元時,要帶具體的型別引數。
正如使用vector一樣,如vector,模擬等價於friend class b。
但是,與vector相比,編譯器(畢竟沒有那麼智慧型)在讀取class b時會覺得很怪異,不知道這個是什麼東西,因此會報錯。
為了讓編譯器認識它,知道它是個例項化的模板,必須在class宣告之前先提前告知編譯器class b原本是個模板。
而friend宣告友元時才表明這只是某乙個具體模板的例項化。
1 template classb;23classa4
;910 template 11
classb12
18 };
(3)普通類a的模板類b友元(一對多友好關係):
這裡普通類class a的友元是模板class b,而不是某乙個具體例項化的class b<>,即只要是這個模板例項化出來的b都是a的友元。
1classa2
;78 template 9
classb10
16 };
(4)例項化
例項化模板類a的例項化模板類b友元(一對一友好關係):
與第2類同理,模板類a的友元類b也是乙個模板,為了讓編譯器識別,必須得提前宣告其是模板。
另外,class a和class b使用相同模板型別引數,因此在使用相同型別例項化後得到的例項類是對應型別的一對一友好關係。
1 template classb;23 template 4
classa5
;1011 template 12
classb13
19 };
(5)模板類a的例項化模板類b友元(多對一友好關係):
與第2類同理,這裡模板類a的友元類b也是乙個模板,為了讓編譯器識別,必須得提前宣告其是模板。
b是乙個特定的例項化的模板類,它是任意模板a例項化後的友元。
1 template classb;23 template 4
classa5
;1011 template 12
classb13
19 };
(6)任意例項化模板類a的模板類b友元(多對多友好關係):
任意乙個例項化的a對任意例項化的b都是友好關係。
1 template 2classa3
;89 template 10
classb11
17 };
好像遺漏了一種情況??
存在模板類a的某一特定例項化對模板類b的任意例項化都是友好關係的場景嗎?
回答:不存在。
因為例項化a時,a必然已經定義過了,對於乙個定義過了的模板,再去新增模板的友元,這是不符合邏輯的。
good good study, day day up.
順序 選擇 迴圈 總結
擴充套件的friend語法
在c 11中,宣告乙個類為另外乙個類的友元時,不再需要使用class關鍵字,也可以使用typedef 或者using 定義的別名。1 class poly 2typedef poly p 34 class lilei 78 class jim 1112 class hanmeimei 從以上 中或許...
C 11包擴充套件
c 11的包擴充套件,記錄一下 吧,採用萬能引用,萬能引用再配合std forward又是完美 我個人還是覺得能清晰表達 盡量不要用這麼奇奇怪怪的語句吧?完美 可以考慮,確實降低的拷貝的成本。今天在github看乙個人執行緒池的demo,發現他的執行緒池裡充滿了這些奇奇怪怪的寫法,明明是乙個普普通通...
C 11語法甜點
c 11中引入了許多簡化程式設計工作的語法上的新特性,我們暫且美其名曰 語法甜點 下面一一進行介紹。語法甜點1 序列for迴圈 序列for迴圈是一種簡化的for迴圈,可用於遍歷一組序列,包括各種容器 string 陣列 初始化列表以及由begin和end函式定義的序列。示例 如下 1 vectorv...