HackingC++ Learning笔记 Chapter9-Custom Types – Part 2

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

Comparing Custom Types 比较自定义类型

Literal Types

Arithmetic Types

Unique Resource Ownership

Node-Based Data Structures

Special Class Members

Shared Resource Ownership

Object Oriented Programming

Move Semantics

相关文章
相关标签/搜索