友元函数、友元类

友元函数是一个全局函数,只要把一个全局函数声明为某个类的友元函数,那么在这个函数中可以使用类的私有成员(因为类的私有成员一般只能在类中可访问,在类外只能使用成员函数来间接访问),所以友元函数破坏了面向对象的封装性。

因为要访问对象的私有成员,所以一般友元函数会设计一个形参——对象类型:

class A
{
     public:
          friend void fun(A* , int a1);
     private:
          int a;  
};


void fun(A* a_mid , int a1)
{
      a_mid->a = a1;      //a_mid->a访问私有成员成立
}

void fun_2(A* a_mid , int a1)  //普通全局函数
{
      a_mid->a = a1;      //a_mid->a访问私有成员不能成立
}

void main()
{
      A ad;
      fun(&ad , 2);
      
}

那么将友元函数声明为什么权限跟调用有关系吗?——无关。

class A
{
     public:
          friend void fun(A* , int a1);
     private:
          friend void fun_2(A* , int a1);
          int a;  
};


void fun(A* a_mid , int a1)
{
      a_mid->a = a1;      //a_mid->a访问私有成员成立
}

void fun_2(A* a_mid , int a1)
{
      a_mid->a = a1;      //a_mid->a访问私有成员成立
}

友元函数与普通的成员函数的区别:

它们都可以在函数体中对类的成员变量进行访问(任意属性的成员变量,尤其是私有成员)。但是类的成员函数,由于this指针的存在,可以没有对象类型形参。

友元函数,在函数体中可以使用类的私有成员,这里说的使用是指直接访问:

void fun(A* a_mid , int a1)
{
      a_mid->a = a1;
}

void fun(A& a_mid , int a1)
{
      a_mid.a = a1;
}

 

友元类:将一个类声明为另一个类的友元,那么这个类的所有成员函数都是另一个类的友元函数。

 

posted @ 2016-10-17 14:25  e-data  阅读(128)  评论(0)    收藏  举报