友元包括友元函數和又元類
友元函數
友元函數是指某些雖然不是類成員卻能夠訪問類的所有成員的函數。類授予它的友元特別的訪問權。通常同一個開發者會出於技術和非技術的原因,控制類的友元和成員函數(否則當你想更新你的類時,還要徵得其它部分的擁有者的同意)。
普通友元函數
語法:
聲明位置:公有私有均可,常寫爲公有
聲明形式: friend + 普通函數聲明
實現位置:可以在類外或類中
實現代碼:在類外實現與普通函數相同(不加friend和類::)
一般特性:類似普通函數,可直接調用
如下面代碼所示:
class Boy
{
private:
string name;
int age;
public:
Boy(string sName, int iAge)
{
name = sName;
age = iAge;
}
//內部聲明需要加friend
friend void makefriend(const Boy&b1,const Boy&b2);
};
void makefriend(const Boy&b1, const Boy&b2)
{
cout<< "One boy's name is "<<b1.name<<", age is "<<b1.age<<endl;//訪問對象中的private成員暢通無阻
cout << "The other boy's name is "<<b2.name<<", age is "<<b2.age<<endl;
cout << b1.name<<" and "<<b2.name<<" will make friends with each other."<<endl;
}
void testNormalFriend()
{
Boy b1("Positive",23);
Boy b2("persist",22);
makefriend(b1, b2);//直接調用友元函數
}
其它類的成員函數作友元
語法:
聲明位置:聲明在公有域裏
聲明形式:friend + 成員函數的聲明
如下面的代碼
class Girl;
class Boy
{
private:
string name;
int age;
public:
Boy(string sName, int iAge)
{
name = sName;
age = iAge;
}
//成員函數
void makeCouple(const Girl&);
};
class Girl
{
private:
string name;
int age;
public:
Girl(string sName, int Iage)
{
name = sName;
age = Iage;
}
//在Girl類裏聲明Boy的成員函數makeCouple爲友元函數
friend void Boy::makeCouple(const Girl&);
};
void Boy::makeCouple(const Girl&g)
{
cout << "Boy's name is "<<name<<", age is "<<age<<endl;
//友元函數訪問Girl中的私有成員
cout << "Girl's name is "<<g.name<<", age is "<<g.age<<endl;
cout << "They become couple."<<endl;
}
void testMemberFuncFriend()
{
Boy b("Positive",23);
Girl g("Nice",21);
b.makeCouple(g);
}
運算符重載友元函數
語法:
聲明位置:公私有域均可
聲明形式:friend 類名 函數名(參數),參數中必須有一個是對應類名的類型的
如下面的代碼:
class Boy
{
private:
string name;
int age;
public:
Boy(string sName, int iAge)
{
name = sName;
age = iAge;
}
//友元函數重載運算符
friend Boy operator ++(Boy&);
void showMe()
{
cout<< "Boy's name is "<<name<<", age is "<<age<<endl;
}
};
//運算符重載
Boy operator++(Boy &b)
{
b.age++;
return b;
}
void testOperatorFriend()
{
Boy b("Positive",26);
b.showMe();
++b;
b.showMe();
}
友元類
聲明A是B的友元類後,A中的成員函數就是B的友元函數了
語法:
聲明位置:私有區域或公有區域均可
聲明形式:friend + class + 類名
調用:作爲友元類的成員函數來調用
如下面的代碼:
class Girl;
class Boy
{
private:
string name;
int age;
public:
Boy(string sName, int iAge)
{
name = sName;
age = iAge;
}
void makeCouple(const Girl&);//Boy類的所有成員函數都可以作爲Girl的友元來訪問Girl
};
class Girl
{
private:
string name;
int age;
friend class Boy;//聲明Boy爲Girl的友元類
public:
Girl(string sName, int Iage)
{
name = sName;
age = Iage;
}
};
//makeCouple既是Boy的成員函數,也是Girl的友元函數
void Boy::makeCouple(const Girl&g)
{
cout << "Boy's name is "<<name<<", age is "<<age<<endl;
cout << "Girl's name is "<<g.name<<", age is "<<g.age<<endl;//可訪問Girl的私有成員,正常情況只有Girl的成員函數纔可以訪問其私有成員
cout << "They become couple."<<endl;
}
void testClassFriend()
{
Boy b("Positive",23);
Girl g("Nice",21);
b.makeCouple(g);
}