首页 > 代码库 > c++ 中的友元函数的普通用法

c++ 中的友元函数的普通用法

   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

 

c++ 中的友元函数的普通用法