友元函数、友元类
友元函数是一个全局函数,只要把一个全局函数声明为某个类的友元函数,那么在这个函数中可以使用类的私有成员(因为类的私有成员一般只能在类中可访问,在类外只能使用成员函数来间接访问),所以友元函数破坏了面向对象的封装性。
因为要访问对象的私有成员,所以一般友元函数会设计一个形参——对象类型:
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; }
友元类:将一个类声明为另一个类的友元,那么这个类的所有成员函数都是另一个类的友元函数。
内在的趣味,表面的繁琐