友元

友元(friend)
  問題的提出
  咱們已知道類具備封裝和信息隱藏的特性。只有類的成員函數才能訪問類的私有成員,程序中的其餘函數是沒法訪問私有成員的。非成員函數能夠訪問類中的公有成員,可是若是將數據成員都定義爲公有的,這又破壞了隱藏的特性。另外,應該看到在某些狀況下,特別是在對某些成員函數屢次調用時,因爲參數傳遞,類型檢查和安全性檢查等都須要時間開銷,而影響程序的運行效率。
  爲了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函數,但它須要在類體內進行說明,爲了與該類的成員函數加以區別,在說明時前面加以關鍵字friend。友元不是成員函數,可是它能夠訪問類中的私有成員。友元的做用在於提升程序的運行效率,可是,它破壞了類的封裝性和隱藏性,使得非成員函數能夠訪問類的私有成員。
  友元能夠是一個函數,該函數被稱爲友元函數;友元也能夠是一個類,該類被稱爲友元類。
  友元函數
  友元函數的特色是可以訪問類中的私有成員的非成員函數。友元函數從語法上看,它與普通函數同樣,即在定義上和調用上與普通函數同樣。下面舉一例子說明友元函數的應用。c++

#include 
  #include 
  class Point
  {
  public:
  Point(double xx, double yy) { x=xx; y=yy; }
  void Getxy();
  friend double Distance(Point &a, Point &b);
  private:
  double x, y;
  };
  void Point::Getxy()
  {
  cout<<"("<
  }
  double Distance(Point &a, Point &b)
  {
  double dx = a.x - b.x;
  double dy = a.y - b.y;
  return sqrt(dx*dx+dy*dy);
  }
  void main()
  {
  Point p1(3.0, 4.0), p2(6.0, 8.0);
  p1.Getxy();
  p2.Getxy();
  double d = Distance(p1, p2);
  cout<<"Distance is"<
  }


 

說明:在該程序中的Point類中說明了一個友元函數Distance(),它在說明時前邊加friend關鍵字,標識它不是成員函數,而是友元函數。它的定義方法與普通函數定義同樣,而不一樣於成員函數的定義,由於它不須要指出所屬的類。可是,它能夠引用類中的私有成員,函數體中a.x,b.x,a.y,b.y都是類的私有成員,它們是經過對象引用的。在調用友元函數時,也是同普通函數的調用同樣,不要像成員函數那樣調用。本例中,p1.Getxy()和p2.Getxy()這是成員函數的調用,要用對象來表示。而Distance(p1, p2)是友元函數的調用,它直接調用,不須要對象表示,它的參數是對象。(該程序的功能是已知兩點座標,求出兩點的距離。)windows

 

本人新博客網址爲: http://www.hizds.com
本博客注有「轉」字樣的爲轉載文章,其他爲本人原創文章,轉載請務必註明出處或保存此段。c++/lua/windows逆向交流羣:69148232
相關文章
相關標籤/搜索