C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 定義
如果一個類模板包含一個非模板友元,則友元被授權(quán)可以訪問所有模板實例。如果友元自身是模板,類可以授權(quán)給所有友元模板實例,也可以只授權(quán)給特定實例。
1.1 一對一友好關(guān)系
類模板與另一個(類或函數(shù))模板間友好關(guān)系的最常見的形式是建立對應(yīng)實例及其友元間的友好關(guān)系。
eg. Blob類應(yīng)該將BlobPtr類和一個模板版本的Blob相
//前置聲明,在Blob中聲明友元所需要的 template <typename> class BlobPtr; template <typename> class Blob; // 運算符==中的參數(shù)所需要的 template <typename T> bool operator== (const Blob<T>&,const Blob<T>&) ;template <typename T> class Blob {//每個Blob實例將訪問權(quán)限授予用相同類型實例化的BlobPtr和相friend class B1obPtr<T> ;friend bool operator==<T> (const Blob<T>&, const Blob<T>&) ;// 其他成員定義, 與12.1.1 (第405頁)相同 };友元的聲明用Blob的模板形參作為它們自己的模板實參。因此,友好關(guān)系被限定在用相同類型實例化的Blob與BlobPtr相等運算符之間
Blob<char> ca; // BlobPtr<char> 和operator==<char>都是本對象的友元 Blob<int> ia;// BlobPtr<int>和operator==<int>都是本對象的友元1.2 通用和特定的模板友好關(guān)系
一個類也可以將另一個模板的每個實例都聲明為自己的友元,或者限定特定的實例為友元:
//前置聲明,在將模板的一個特定實例聲明為友元時要用到 template <typename T> class Pal; class C { // C是一個普通的非模板類friend class Pal<C>; //用類C實例化的Pal是C的一個友元// Pal2的所有實例都是C的友元;這種情況無須前置聲明template <typename T> friend class Pal2; }; template <typename T> class C2 { // C2 本身是一個類模板// C2的每個實例將相同實例化的Pal聲明為友元friend class Pal<T>; // Pal 的模板聲明必須在作用域之內(nèi)// Pal2的所有實例都是C2的每個實例的友元,不需要前置聲明template <typename X> friend class Pal2;// Pal3是一個非模板類,它是C2所有實例的友元friend class Pal3; //不需要Pal3的前置聲明 .};1.3 令模板自己的類型參數(shù)成為友元
可以將模板類型參數(shù)聲明為友元.
eg. 將用來實例化Bar的類型聲明為友元。
對于某個類型名Foo:
Foo將成為Bar<Foo>的友元 Sales_ data 將成為Bar<Sales data>的友元 template <typename Type> class Bar {friend Type; // 將訪問權(quán)限授予用來實例化Bar的類型//... };注意:雖然友元通常來說應(yīng)該是一一個類或是一一個函數(shù), 但我們完全可以用一個內(nèi)置類型來實例化Bar.這種與內(nèi)置類型的友好關(guān)系是允許的,以便我們能用內(nèi)置類型來實例化Bar這樣的類。
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha