c++中友元関数の理解と使用.

5291 ワード

c++を勉強しているうちに、友元関数と友元類については、まだ理解しにくいような気がしますが、心を落ち着かせて、理解して、私をいくつかの点に置く必要があります.まず,友元関数について述べる.
(1)友元関数:
1)C++       ,            (       )     ;
2)                 ,            ,                   private  protected

友元関数宣言の一般的な形式を使用するには、次の手順に従います.
friend <    > <   > (<    >);

友元関数を使用する際の注意点:
  • クラスではキーワードfriendを使用して友元関数を修飾しますが、この関数はクラスのメンバー関数ではありません.宣言はクラスのプライベート部分に置くことも共有部分に置くこともできます.メタ関数の定義はクラス体外で実現され,クラス限定を加える必要はない.
  • クラスのメンバー関数は、別のクラスのメタ関数であってもよく、1つの関数は、複数のクラスのメタ関数であってもよい.
  • ユーティリティー関数は、クラス内のプライベート・メンバーおよびその他のデータにアクセスできますが、アクセスはデータ・メンバーを直接使用することはできません.オブジェクトを参照する必要があります.
  • 友元関数は呼び出しで一般関数と同様に、オブジェクトを参照する必要はありません.

  • 例えば、上記の1、3、4の要点の使用をここで説明し、理解する.
    #include 
    #include 
    using namespace std;
    
    class persion{
    public:
          persion(char *pn);
    
          //    ;
          friend void setweigth(persion &p,int h);//  ,                  ,           3 4;
          void disp(); //     
    private:
          char name[20];
          int weigth,age;      
    };
    
    persion::persion(char *pn)   //    
    {
       strcpy(name,pn);
       weigth=0;
    }
    void persion::disp()
    {
    cout<"--"<//         :          (perion::setweigth)    ,        disp()    ,        ,   ,         ,     。
    void setweigth(persion &pn,int w)
    {
    strcpy(pn.name,pn);//       
    pn.weigth=w;       //        
    
    }
    
    void  main()
    {
      persion p("zhansan");
      //    setweigth(),         。
      setweigth(p,60);
    
      p.disp();  //        。
    
    }
    

    ポイント2の使用について、コードの例を示します.
    #include 
    #include 
    using namespace std;
    
    class wheel;
    class car{
    public:
        car(char *pn);
        void run(wheel &w);    //    ,  wheel        
    private:
        char name[20];
    
    };
    car::car(char *pn)
    {
    strcpy(name,pn);
    }
    
    class wheel{
    public:
        wheel(int s);
        friend void car::run(wheel &w);   //   car            。
    private:
        int speed;
    };
    wheel::wheel(int s)
    {
      speed=s;
    }
    int  main(int argc, char const *argv[])
    {
        wheel w(60);
        car c("New car");
        c.run(w);
        return 0;
    }
    
    void car::run(wheel &w)   //car        
    {
        cout<<"the car is running"<cout<<"name: "<" speed :"<