友元函數(shù)介紹
-
為什么要使用友元函數(shù)
- 運算符重載的某些場合需要使用友元捶码。(略)
- 兩個類要共享數(shù)據(jù):允許外面的類或函數(shù)去訪問類的私有變量和保護變量递瑰,從而使兩個類共享同一函數(shù)破停。
-
友元函數(shù)的優(yōu)缺點
優(yōu)點:方便
缺點:友元函數(shù)破環(huán)了封裝機制陷嘴。不得已的情況下才使用友元函數(shù)
友元函數(shù)的使用
-
友元函數(shù)的參數(shù)
因為友元函數(shù)沒有this指針,則參數(shù)要有三種情況:
- 要訪問非static成員時摔竿,需要對象做參數(shù)
- 要訪問static成員或全局變量時面粮,則不需要對象做參數(shù)
- 如果做參數(shù)的對象是全局對象,則不需要對象做參數(shù)
-
友元函數(shù)的位置
因為友元函數(shù)是類外的函數(shù)继低,所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別熬苍。
-
友元函數(shù)的調(diào)用
直接調(diào)用,不需要通過對象或指針
-
友元函數(shù)的分類
- 普通函數(shù)友元函數(shù)
#include <iostream>
using namespace std;
class INTEGER
{
friend void Print(const INTEGER& obj);//聲明友元函數(shù)
};
void Print(const INTEGER& obj){ //在類外定義的函數(shù)體袁翁,無需void NTERGER::Print()
cout<<"integer!"<<endl;
}
int main()
{
INTEGER obj;
Print(obj);//直接調(diào)用
return 0;
}
- 類Y的所有成員函數(shù)都為類X友元函數(shù)—友元類
使用單個聲明使Y類的所有函數(shù)成為類X的友元柴底,使類Y的對象可以具有類X和類Y的功能。聲明位置:公有私有均可粱胜,常寫為私有(把類看成一個變量)
private:
friend + class + 類名
#include <iostream>
using namespace std;
// class boy;
class girl{
public:
girl(string Newname, int Newage){
name = Newname;
age = Newage;
}
private:
string name;
int age;
friend class boy; //聲明類boy是類girl的友元
};
class boy {
public:
boy(string Newname, int Newage){
name = Newname;
age = Newage;
}
void disp(girl &x){
cout<<"boy's name is:"<<name<<",age:"<<age<<endl;//正常情況柄驻,boy的成員函數(shù)disp中直接訪問boy的私有變量
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
//借助友元,在boy的成員函數(shù)disp中焙压,借助girl的對象鸿脓,直接訪問girl的私有變量
//正常情況下抑钟,只允許在girl的成員函數(shù)中訪問girl的私有變量
}
string name;
int age;
private:
// friend class girl;
};
int main()
{
boy b("Tom", 19);
girl g("Summer", 19);
b.disp(g); //b調(diào)用自己的成員函數(shù),但是以g為參數(shù)野哭,友元機制體現(xiàn)在函數(shù)disp中
return 0;
}
運行結(jié)果:
boy's name is:Tom,age:19
girl's name is:Summer,age:19
[Finished in 0.4s]
首先在塔,定義的格式是在private里,"friend class 類名"拨黔,其次蛔溃,如果boy想訪問girl,那么girl需要承認boy是她的朋友篱蝇,boy承認不承認都沒關(guān)贺待;boy單方面認為girl是他的朋友,沒門零截!
- 類Y的一個成員函數(shù)為類X的友元函數(shù)
這個我也沒看懂