Friends 友元
class MyType {… friend class Other; …};
#授权Other类为友元类,可以访问MyType类的私有成员
class MyType {… friend void print(MyType const&); …};
#授权独立的函数print为友元函数, 可以访问MyType类的私有成员
不同级别的封装/数据Hiding
public
成员/成员函数可以通过_所有_函数或类型进行访问private
数据只能由相同类型的成员或者成员函数访问friend
允许有限数量的函数/类 访问私有成员
使用场景
- 通过(相互)私有访问 将一个抽象模型划分为几个友元类
- 除了几个朋友之间,成员对外隐藏
- 可以写一个像成员函数一样工作的独立friend函数
- 防止隐式参数转换??
friend Types 友元类
/* Example: 拆分数据+视图
* 场景/需求
* 1.从不同的线程,网络进程等访问Simulation的当前状态
* 2.在任何给定时间,只有一部分结果有效,并且应该可以从Simulation中读取
* 3.处理不再存在仿真但其他进程仍要访问它的情况
* --> 需要一种方法来调节/限制对Simulation对象的(并发)访问
* --> simulation的数据对几乎其他所有的类和函数时私有的
* Solution: 2 Types (Simulation + View)
* 1.每个simulation有多个独立的视图
* 2.视图可以控制并可能延迟对simulation的访问
* 3.即使simulation对象不再存在,视图也可以处理请求
* 4.视图对象是访问simulation数据的唯一方法
* 5.Simulation的内部状态可以对所有其他类型隐藏
*/
class Simulation {
// grant views access to private data:
friend class SimulationView;
// hidden state …
public:
// only ctor & dtor are public
Simulation(Settings const&); // init & run
~Simulation(); // finalize
};
class SimulationView {
public:
// connect to simulation object
explicit SimulationView(Simulation const*);
// functions for observing simulation go here
…
};
friend Functions 友元函数
/* Example: Stream Input of Private Data 私有数据的流输入
* operator >> 如此处定义
* 是独立的(运算符)函数,而不是成员函数
* 在Point2d类的范围内声明和定义
* 有权访问Point2d类的所有私人成员
*/
class Point2d {
double x_; // private!
double y_;
public:
explicit Point2d(double x, double y): x_{x}, y_{y} {}
double x() const { return x_; }
double y() const { return y_; }
// can access private members of Point2d:
friend std::istream& operator >> (std::istream& is, Point2d& p) {
return is >> p.x_ >> p.y_;
}
};
int main() {
Point2d p {0,0};
std::cin >> p; //
}
Preventing Implicit Conversions 防止隐式转换
通常,隐式转换(例如从from unit_ratio
到ratio
)不是一个好东西,他们可能会造成意外的错误和不必要的运行时/内存开销
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。