c++中友元函數理解與使用

在學習c++這一塊,關於友元函數和友元類,感受仍是很差理解,可是井下心來,理解,須要把我一下幾點。 
首先講友元函數。ios

(1)友元函數:c++

1)C++中引入友元函數,是爲在該類中提供一個對外(除了他本身意外)訪問的窗口;
2)這個友元函數他不屬於該類的成員函數,他是定義在類外的普通函數,只是在類中聲明該函數能夠直接訪問類中的private或者protected成員。
使用友元函數聲明的通常形式:函數

friend <返回類型> <函數名> (<參數列表>);
使用友元函數注意的要點:學習

1,類中經過使用關鍵字friend 來修飾友元函數,但該函數並非類的成員函數,其聲明能夠放在類的私有部分,也可放在共有部分。友元函數的定義在類體外實現,不須要加類限定。spa

2,一個類中的成員函數能夠是另一個類的友元函數,並且一個函數能夠是多個類友元函數。
3,友元函數能夠訪問類中的私有成員和其餘數據,可是訪問不可直接使用數據成員,須要經過對對象進行引用。
4,友元函數在調用上同通常函數同樣,沒必要經過對對象進行引用。
例如以下形式:這裏解釋上面的1,3,4要點的使用,加以理解。對象

#include <iostream>
#include <cstring>
using namespace std;字符串

class persion{
public:
      persion(char *pn);string

      //友元函數; io

     //注意,參數列表中通常會有一個引用類型的形參,緣由參考上面的使用要點3和4;
      friend void setweigth(persion &p,int h);
      void disp(); //類成員函數
private:
      char name[20];
      int weigth,age;      
};class

persion::persion(char *pn)   //構造函數
{
   strcpy(name,pn);
   weigth=0;
}
void persion::disp()
{
cout<<name<<"--"<<weigth<<endl;
}


//友元函數的具體實現:這裏沒有類限定例如 (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 <iostream>
#include <cstring>
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"<<endl;     cout<<"name: "<<name<<" speed :"<<w.speed<<endl; }

相關文章
相關標籤/搜索