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

相關文章
相關標籤/搜索