背景:在某些情況下,特別是在對(duì)某些成員函數(shù)多次調(diào)用時(shí),由于參數(shù)傳遞,類型檢查和安全性檢查等都需要時(shí)間開銷,而影響程序的運(yùn)行效率。為了解決上述問題,提出一種使用友元的方案。
△友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元類。友元函數(shù)的特點(diǎn)是能夠訪問類中的私有成員的非成員函數(shù)。友元函數(shù)從語法上看,它與普通函數(shù)一樣,即在定義上和調(diào)用上與普通函數(shù)一樣
友元函數(shù)是可以直接訪問類的私有成員的非成員函數(shù)。它是定義在類外的普通函數(shù),它不屬于任何類,但需要在類的定義中加以聲明,聲明時(shí)只需在友元的名稱前加上關(guān)鍵字friend。
☆友元函數(shù)的參數(shù):
因?yàn)橛言瘮?shù)沒有this指針,則參數(shù)要有三種情況:
要訪問非static成員時(shí),需要對(duì)象做參數(shù);
要訪問static成員或全局變量時(shí),則不需要對(duì)象做參數(shù);
如果做參數(shù)的對(duì)象是全局對(duì)象,則不需要對(duì)象做參數(shù);
☆友元函數(shù)的位置:
因?yàn)橛言瘮?shù)是類外的函數(shù),所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別。
☆友元函數(shù)和類的成員函數(shù)的區(qū)別:
成員函數(shù)有this指針,而友元函數(shù)沒有this指針。
友元函數(shù)是不能被繼承的,就像父親的朋友未必是兒子的朋友。
以下為一個(gè)例子:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
class CTyre{
private:
int radius;
int width;
public:
CTyre(){ cout<<"CTyre contructor"<<endl;}
~CTyre(){ cout<<"CTyre destructor"<<endl;}
//友元函數(shù)的聲明(在類中)
friend void CCar(const int &radius,const int &width);
};//別忘了分號(hào)
//友元函數(shù)的定義(在類外)
void CCar(int &radius,int &width)
{
cout<<"汽車輪胎的半徑為:"<<radius<<endl;
cout<<"汽車輪胎的厚度為:"<<width<<endl;
}
int main(){
int tr,tw;
cout<<"請(qǐng)輸入汽車輪胎的半徑:"<<endl;
cin>>tr;
cout<<"請(qǐng)輸入汽車輪胎的厚度:"<<endl;
cin>>tw;
CCar(tr,tw);
return 0;
}
作者:華中師范大學(xué) 計(jì)算機(jī)學(xué)院 蒲東齊
文本作者才疏學(xué)淺,如有錯(cuò)誤,請(qǐng)指正!