C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性。如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低。
友元的提出可以使得类外的函数来访问类中的私有成员,保护成员。
友元的使用分为三类:
1.类外的普通函数声明为该类的友元函数。
格式: friend 类型 函数名(形参)
2.其他类的成员函数声明为该类的友元函数。
格式:friend 类型 类名::函数名(形参)
3.其他类为该类的友元类,这样类中的所有成员函数都是该类的友元函数。
格式:friend class 类名
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream>
using namespace std;
class A;
class B { public: //类B的成员函数为类A的友元函数 void display(A &a); };
class C { public: //类C是类A的友元类 void display(A &a); };
class A { public: A(int i):x(i){}
int getX() { return x; }
friend void display(A &a); friend void B::display(A &a); friend C;
private: int x; };
//类外普通函数为类A的友元函数 void display(A &a) { cout << a.x << endl; //友元函数直接访问类中的私有成员 }
void B::display(A &a) { cout << a.x << endl; }
void C::display(A &a) { cout << a.x << endl; }
int main() { A a(18);
//无法直接访问类A的私有变量x,需要通过对外提供的函数来访问 cout << a.getX() << endl;
//类B的成员函数为类的A的友元函数 B b; b.display(a);
//类C是类A的友元类 C c; c.display(a);
return 0; }
|
###总结:
1.友元声明在类中,但并不属于该类的成员。
2.友元的关系不能继承。
3.在类的任何位置声明友元都行,不受访问权限限制。
4.友元关系提高了程序效率,但破坏了数据的安全性。慎重使用。
5.友元的关系是单向。如类B是类A的友元,反过来类A不一定是类B的友元,看类B中是否有声明。