友元函數介紹
-
為什么要使用友元函數
- 運算符重載的某些場合需要使用友元。(略)
- 兩個類要共享數據:允許外面的類或函數去訪問類的私有變量和保護變量,從而使兩個類共享同一函數。
-
友元函數的優缺點
優點:方便
缺點:友元函數破環了封裝機制。不得已的情況下才使用友元函數
友元函數的使用
-
友元函數的參數
因為友元函數沒有this指針,則參數要有三種情況:
- 要訪問非static成員時,需要對象做參數
- 要訪問static成員或全局變量時,則不需要對象做參數
- 如果做參數的對象是全局對象,則不需要對象做參數
-
友元函數的位置
因為友元函數是類外的函數,所以它的聲明可以放在類的私有段或公有段且沒有區別。
-
友元函數的調用
直接調用,不需要通過對象或指針
-
友元函數的分類
- 普通函數友元函數
#include <iostream>
using namespace std;
class INTEGER
{
friend void Print(const INTEGER& obj);//聲明友元函數
};
void Print(const INTEGER& obj){ //在類外定義的函數體,無需void NTERGER::Print()
cout<<"integer!"<<endl;
}
int main()
{
INTEGER obj;
Print(obj);//直接調用
return 0;
}
- 類Y的所有成員函數都為類X友元函數—友元類
使用單個聲明使Y類的所有函數成為類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的成員函數disp中直接訪問boy的私有變量
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
//借助友元,在boy的成員函數disp中,借助girl的對象,直接訪問girl的私有變量
//正常情況下,只允許在girl的成員函數中訪問girl的私有變量
}
string name;
int age;
private:
// friend class girl;
};
int main()
{
boy b("Tom", 19);
girl g("Summer", 19);
b.disp(g); //b調用自己的成員函數,但是以g為參數,友元機制體現在函數disp中
return 0;
}
運行結果:
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承認不承認都沒關;boy單方面認為girl是他的朋友,沒門!
- 類Y的一個成員函數為類X的友元函數
這個我也沒看懂