“模板类与友元”那些事(C++)
2019獨角獸企業重金招聘Python工程師標準>>>
模版類就是類模版實例化之后的類,友元就是一種對函數訪問權限的控制,通過將函數設為友元函數讓其能夠訪問其他外部函數不能訪問的"private"成員變量。
?????? 接著我們介紹一個他們結合在一起會產生什么樣的結果,他們的結合分為三種情況:
????????1、模板類的非模板友元函數
????????該友元函數的特點是:
????????A)當該友元函數不使用類模版中的成員變量時,與一般的友元函數沒有區別:
????????B)當該友元函數使用類模版中的成員變量時,必須為每一個基本類型定義一個友元函數,比如show<int> 和 show<double>.這兩個并不是函數的重定義,屬于函數重載。
???測試代碼如下:
| 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 | template<typename?T> class?Base{ public: ????Base(T?x,?T?y):?x(x),?y(y){} ????friend?void?print(); ????friend?void?show(Base<T>?&a); private: ????T?x; ????T?y; }; void?show(Base<int>?&a) { ????cout?<<?"x?=?"?<<?a.x?<<?",?y?=?"?<<?a.y?<<?endl; } void?show(Base<double>?&a) { ?????cout?<<?"x?=?"?<<?a.x?<<?",?y?=?"?<<?a.y?<<?endl; } void?print(){ ????cout?<<?"hello,?world"?<<?endl; } int?main() { ????Base<int>?ai(99,?999); ????Base<double>?ad(99.99,?200.88); ????print(); ????show(ai); ????show(ad); ????return?0; } |
????????2、模板類的約束友元函數
????????????該友元函數的特點是:每一個類的具體化與友元的具體化要匹配,也就是說,int類具體化獲得一個int類的友元函數,double類就具體化會獲得一個double函數,int類具體化不可能獲得double類函數;
???????????要定義一個約束模板友元函數分三步:
????????A)在定義類之前聲明友元函數模板;
????????B)在類中聲明該友元函數模板;
????????C)定義友元函數,
?????????注意,定義友元函數時形參列表中的”T“代表,具體化之后的類,并不是類的模板參數,也就是假如具體化一個模板類”A<int>“, ”T“代表”A<int>“, 并不是”int“;通過這種方式來約束該友元函數屬于某個具體化之后的模板。
| 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 | template<typename?T>void?print();?//?第一步:在類定義之前生命函數模板 template<typename?T>void?show(T?&t); ?? template<typename?T> class?Base{ public: ????Base(T?x,?T?y):?x(x),?y(y){} ????friend?void?print<T>();??//?第二步:在類中聲明友元函數模板 ????friend?void?show<>(Base<T>&?a); private: ????T?x; ????T?y; }; //第三步:定義友元函數 void?print() { ????cout?<<?"hello,?friend?function?template"?<<?endl; } template<typename?T> void?show(T?&a)??//?這里的T代表一個具體化之后的類 { ????cout?<<?"x?=?"?<<?a.x?<<?",?y?=?"?<<?a.y?<<?endl; } int?main() { ????Base<int>?a(99,?999); ????print(); ????show(a); ????return?0; } |
????????3、模板類的非約束友元函數
????該友元函數的特點與約束友元函數相反:也就是每個類的具體化都會獲得每個函數的具體化,假如具體化一個int類,在該類中仍然可以獲得一個double、string、int等類的友元函數。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | template<typename?T> class?Base{ public: ????Base(T?x,?T?y):?x(x),?y(y){} ????template<typename?D> ????friend?void?print(Base<D>?&obj); private: ????T?x; ????T?y; }; template<typename?D> void?print(Base<D>?&obj){ ????cout?<<?"x?=?"?<<?obj.x?<<?",?y?=?"?<<?obj.y?<<?endl; } int?main() { ????Base<int>?a(99,?999); ????print(a); ????return?0; } |
?
免費學習更多精品課程,登錄樂搏學院官網http://www.learnbo.com/
或關注我們的官方微博微信,還有更多驚喜哦~
?
本文出自 “11219885” 博客,請務必保留此出處http://11229885.blog.51cto.com/11219885/1791770
轉載于:https://my.oschina.net/learnbo/blog/808978
總結
以上是生活随笔為你收集整理的“模板类与友元”那些事(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wget下载工具
- 下一篇: 详解XStream别名