C++中友元函數的調用,一般分為三種方式:
1、一般的友元函數
2、類A作為類B的友元類,則類A的成員函數都是類B的友元函數。
3、一個類的成員函數作為另外一個類的友元函數
//分為友元函數的例子
類A 作為測試的類,類B 是類A的友元類。
class A
{
public:
A()
{
a = 100;
b = 10;
}
friend class B; //這兒公私均可,常常用到的是變為私有變量,類B是類A的友元類。友元的第二種方式,需要帶class
int getA()
{
return a;
}
void printAB()
{
cout<<"a"<<a<<" b"<<b<<endl;
}
friend void setA(A *p, int _a); //友元函數的定義,friend 放在前面,記得友元函數的是將friend 放在函數的前面 ,友元函數的第一種方式
protected:
private:
int a;
int b;
static int module;
};
int A::module = 10;
class B
{
public:
void setA(A *p, int _a);
void displayA(A *p)
{
cout<<p->a<<"ddddd"<<endl;
}
protected:
private:
};
//友元類的類的成員函數都是友元函數 第二種方式
void B:: setA( A *p, int _a)
{
p->a = _a + 100;
p->b = _a + 100;
}
//普通的友元函數 第一種方式的具體實現
void setA(A *p, int _a)
{
p->a = _a;
p->b = _a;
}
用類girl 和類boy來舉例,既有boy 作為girl的友元類,又有boy的成員函數是girl的友元函數,這兩種形式。
class girl;
class boy
{
public:
void display_girl(girl &x); //普通成員的函數的定義沒有改變
//{
// cout<<"girl-name"<<x.name<<"age"<<x.age<<endl;
//}
};
class girl
{
public: //當初這個沒有寫pulic 導致出現錯誤
girl()
{
name = NULL;
name = new char[10];
if( NULL !=name)
{
strcpy(name,"fal");
}
age = 26;
}
~girl()
{
if( NULL != name){
//free(name);
delete [] name;
}
}
private:
char *name;
int age;
//friend class boy; //當初寫代碼的時候沒有寫class, 這是一個錯誤 ,友元的第二這種方式
friend void boy::display_girl(girl &x); //允許某一個類的成員函數訪問 第3種方式
};
友元函數的具體實現過程:
void boy::display_girl(girl &x)
{
cout<<"girl-name:"<<x.name<<"\t age:"<<x.age<<endl;
}
主函數,
int main(void)
{
A testa;
B testB;
girl fal;
boy zjl;
zjl.display_girl(fal);
testB.setA(&testa, 10);
cout<<"aa"<<testa.getA()<<endl;
setA(&testa, 6);
cout<<"bb"<<testa.getA()<<endl;
return 0;
}
備注:learnCpluseplus/FunctionAndReload/dm03_friendly.cpp