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_ratioratio)不是一个好东西,他们可能会造成意外的错误和不必要的运行时/内存开销

Comparing Custom Types 比较自定义类型

image.png

Literal Types

Arithmetic Types

Unique Resource Ownership

Node-Based Data Structures

Special Class Members

Shared Resource Ownership

Object Oriented Programming

Move Semantics


ysysys
10 声望1 粉丝