class MyType {… friend class Other; …}; #受权Other类为友元类,能够访问MyType类的私有成员 class MyType {… friend void print(MyType const&); …}; #受权独立的函数print为友元函数, 能够访问MyType类的私有成员
不一样级别的封装/数据Hiding网络
public
成员/成员函数能够经过_全部_函数或类型进行访问private
数据只能由相同类型的成员或者成员函数访问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
)不是一个好东西,他们可能会形成意外的错误和没必要要的运行时/内存开销code