c++中友元函數理解與使用
在學習c++這一塊,關於友元函數和友元類,感覺還是不好理解,但是井下心來,理解,需要把我一下幾點。
首先講友元函數。
(1)友元函數:
1)C++中引入友元函數,是為在該類中提供一個對外(除了他自己意外)訪問的窗口;
2)這個友元函數他不屬於該類的成員函數,他是定義在類外的普通函數,只是在類中聲明該函數可以直接訪問類中的private或者protected成員。
使用友元函數聲明的一般形式:
friend <返回類型> <函數名> (<參數列表>);
使用友元函數注意的要點:
1,類中通過使用關鍵字friend 來修飾友元函數,但該函數並不是類的成員函數,其聲明可以放在類的私有部分,也可放在共有部分。友元函數的定義在類體外實現,不需要加類限定。
2,一個類中的成員函數可以是另外一個類的友元函數,而且一個函數可以是多個類友元函數。
3,友元函數可以訪問類中的私有成員和其他數據,但是訪問不可直接使用數據成員,需要通過對對象進行引用。
4,友元函數在調用上同一般函數一樣,不必通過對對象進行引用。
例如如下形式:這裡解釋上面的1,3,4要點的使用,加以理解。
#include <iostream>
#include <cstring>
using namespace std;
class persion{
public:
persion(char *pn);
//友元函數;
//注意,參數列表中一般會有一個引用類型的形參,原因參考上面的使用要點3和4;
friend void setweigth(persion &p,int h);
void disp(); //類成員函數
private:
char name[20];
int weigth,age;
};
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;
}
{!-- PGC_COLUMN --}本文轉載自:https://blog.csdn.net/qq_26337701/article/details/53996104
作者:天王蓋地虎626
打開今日頭條,查看更多圖片※使用 ale.js 製作一個小而美的表格編輯器
※資深程序員參加面試因穿著被認為是新手,拿下帽子後,被當場錄取
TAG:程序員小新人學習 |