在學習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; }