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