C++中的类实现了数据的隐藏,在类中的数据成员一般为私有成员,在访问这些数据的时候,必须通过公有的成员函数来访问私有成员,有时希望用直接的方式访问私有成员,C++中的友元实现了这种机制。 友元可以是友元函数,也可以是友元类,模板也可以定义友元。
1 友元类
# include <iostream> using namespace std; class Point { public: friend class Po; Point(int i, int j):x(i),y(j){} void print(); private: int x; int y; }; void Point::print() { cout<<"("<<x<<","<<y<<")"<<endl; } class Po { public: Po(int i,int j):x(i),y(j){} void print(Point &P); private: int x; int y; }; void Po::print(Point & P) { P.print(); cout<<x<<","<<y<<endl; } int main() { Point p(1,2); Po p1(2,3); p1.print(p); cin.get(); return 0; }
2友元函数
# include <iostream> using namespace std; class Point{ public: Point (int i,int j):x(i),y(j){} friend bool equal(Point &,Point &); private: int x; int y; }; bool equal (Point &p1,Point &p2) { return p1.x==p2.x&&p1.y==p2.y; } int main() { Point p1(3,4); Point p2(4,5); cout<<equal(p1,p2)<<endl; cin.get(); return 0; }
友元的关系是单向的,也不具备传递性,A类是B类的友元,B类是C类的友元,此时B类不一定是A类的友元,C类也不一定是A类的友元。
使用友元的好处:实现了不同类的成员函数和普通函数或者不同类的成员函数之间的数据共享,可以避免频繁地调用累的接口函数,节省程序的运行开销。
使用的友元的坏处:破坏了了数据隐藏的特性
使用友元需要在安全性和效率之间折衷选择。
3模板的友元
在类模板中可以出现三种友元声明,每一种都声明了与一个或多个实体的友元关系:
(1)普通非模板类或者函数的友元声明,将友元关系授予明确指定的类或者函数
形式如下:
template <classT>
class A
{
friend class B;
friend void f();
}
(2) 类模板或者函数模板的友元声明,授予对友元所有实例的访问权,形式与上面非模板友元类似
(3) 只授予对类模板或函数模板的特定实例的访问权的友元声明,形式与上面类似,只不过将T类型换为 char *或其他形式
原文:http://blog.csdn.net/u011608357/article/details/18658789