c++学习笔记之类模板中的友元声明
来源:互联网 发布:淘宝现在是什么模式 编辑:程序博客网 时间:2024/06/05 05:15
类模板中出现3种友元声明,每一种友元声明了与一个或者多个实体的友元关系
(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。
(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。
(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。
1 普通友元
以上代码说明FooBar的成员和fun函数可以访问Bar类的任意实例的private成员和protected成员
一般模板友元关系:FooBar的任意实例都可以访问Bar的任意实例的私有成员。fun函数相同。
(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。
(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。
(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。
1 普通友元
非模板类或非模板函数可以是类模板的友元。
#include <iostream>using namespace std;template <class Type> class Bar{ //普通非模版类 friend class FooBar; //普通非模版函数 friend void fun(); private: Type data; public: void setData(Type temp){ data = temp; }};class FooBar{ public: //非模版类成员可以访问Bar类实例的任意成员 void print(){ Bar<int> bari; bari.setData(5); cout<<"data:"<<bari.data<<endl; Bar<string> bars; bars.setData("No"); cout<<"data:"<<bars.data<<endl; }};//非模版函数可以访问Bar类实例的任意成员void fun(){ Bar<int> bari; bari.setData(4); cout<<"data:"<<bari.data<<endl; Bar<string> bars; bars.setData("Yes"); cout<<"data:"<<bars.data<<endl;}int main(){ fun(); FooBar fooBar; fooBar.print(); return 0;}
以上代码说明FooBar的成员和fun函数可以访问Bar类的任意实例的private成员和protected成员
2 一般模版友元关系
友元可以是类模版或者函数模版
#include <iostream>using namespace std;template <class Type> class Bar{ //模版类 template <class T> friend class FooBar; //模版函数 template <class T> friend void fun(const Bar<T>&); private: Type data; public: void setData(Type temp){ data = temp; }};template <class T> class FooBar{ public: //模版类成员可以访问Bar类实例的任意成员 template <class U> void print(Bar<U> &bar){ cout<<"模版类:"<<bar.data<<endl; }};//模版函数可以访问Bar类实例的任意成员template <class T> void fun(const Bar<T> &bar){ cout<<"模版函数:"<<bar.data<<endl;}int main(){ Bar<int> bari; bari.setData(4); Bar<string> bars; bars.setData("Yes"); fun(bari); fun(bars); FooBar<int> fooBari; FooBar<string> fooBars; fooBari.print(bari); fooBars.print(bars); return 0;}
一般模板友元关系:FooBar的任意实例都可以访问Bar的任意实例的私有成员。fun函数相同。
3 特定的模版友元
除了将一个模版的实例设为友元,类也可以只授予对特定实例的访问权。
#include <iostream>using namespace std;//模版声明template <class T> class Bar;template <class T> class FooBar;template <class T> void fun(const Bar<T>&);template <class Type> class Bar{ //模版类特定实例 friend class FooBar<int>; //模版函数特定实例 friend void fun<int>(const Bar<int>&); private: Type data; public: void setData(Type temp){ data = temp; }};template <class T> class FooBar{ public: template <class U> void print(Bar<U> &bar){ cout<<"模版类:"<<bar.data<<endl; }};template <class T> void fun(const Bar<T> &bar){ cout<<"模版函数:"<<bar.data<<endl;}int main(){ Bar<int> bari; bari.setData(4); Bar<string> bars; bars.setData("Yes"); fun(bari); //fun(bars); error:Type data is private FooBar<int> fooBari; FooBar<string> fooBars; fooBari.print(bari); //fooBars.print(bars); error:Type data is private return 0;}
0 0
- c++学习笔记之类模板中的友元声明
- 类模板中的友元声明
- 类模板中的友元声明
- 类模板中的友元声明
- C++ 类模板中的友元声明
- 类模板中的友元声明
- C++模板类中的友元声明
- C++学习笔记之类模板
- ios学习笔记之类声明(接口)
- 类模板中的友元声明和定义
- C++ primer:16.4.3. 类模板中的友元声明 - 声明依赖性
- c++学习之类的友元
- 模板函数的友元声明
- 几种模板友元的声明
- 模板友元函数的声明
- 类模板的友元声明
- 类模板友元声明的依赖性
- C++类模板的友元声明
- spring mvc例子
- Hello World
- 配置apache+php+mysql
- 【PB】从数据窗口获得数据的方法总结
- 磁盘分区表备份与恢复
- c++学习笔记之类模板中的友元声明
- http协议
- 连载《一个程序员的成长历程》-2.城市校园生活
- BIEE 11G控制台乱码解决
- Razor系列-使用MySql数据库就这么简单!
- edwrwr
- html中<button>与<input type="button">区别
- c#字符串加密与解密封装
- Java 加密算法体系结构