友元
一、簡介
- 友元是一種允許非類的成員函數訪問該類的私有成員的一種方式。我們常用的方式用兩種—友元函數,友元類。
-
友元函數
友元函數是可以訪問類的私有成員的函數。他一般是在類外定義的全局函數,不屬於任何類。子啊使用前,需要在待訪問的類中申明。聲明時需要加上friend關鍵字。
格式:friend 數據類型 函數名(類型1 參數1…)
(在相應的類中申明)
class Animal{
private:
char sex;
int age;
public:
Animal(char s,int a){
sex = s;
age = a;
}
friend void show(Animal &obj); //聲明該函數爲該類的友元。
};
//全局函數
void show(Animal &obj)
{
cout << "SEX = " << obj.sex << endl;
cout << "AGE = " << obj.age << endl;
}
int main()
{
Animal al('m',2);
show(al);
}
-
友元類
若是一個類A會頻繁的訪問另一個類B中的私有成員,那麼我們可以把B的私有權限向
A進行開發,這個開放方式,我們就叫做友元類。及B把A當作好朋友,A可以訪問B
中任何的數據。但是友元不具有傳遞性,友元爲單向開放權限。格式:friend class 類名;
[注意:該類一定要存在,在代碼中某個地方定義過]
class girl; //聲明girl類
class Person{
private:
string name;
int age;
public:
void show(){
xxx.
}
friend class girl;
};
class girl{
private:
char sex;
int hair_len;
public:
void show(Person &p){
cout << "NAME\tAGE\tSEX\tHAIR_LEN" << endl;
//cout << p.name << endl;
}
};
【如上面這段代碼中,在申明類girl爲類Person的友元時,需要先對girl進行申明,因爲它的定義在類person的後面,需要告訴編譯器讓編譯器去找到該類】
【特點】
- 友元關係是單向的,不具備交換性。(如:我把你當好朋友,你不一定把我當做好朋友)
- 友元函數不具備傳遞性(如:你是我的好朋友,但是你的好朋友不一定是我的好朋友)