1、友元函数
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
通俗地说,友元关系就是一个类主动声明哪些其他类或函数是它的朋友,进而给他们提供对本类的访问特许。也就是说,用过友元关系,一个普通函数或者类的成员可以访问封装于另外一个类中的数据。从一定程度上讲,友元是对数据隐蔽和封装的破坏。但是为了数据共享,提高程序的效率和可读性,很多情况下这种小的破坏也是必要的。
使用友元函数计算两点间的距离:
#include <iostream> #include <math.h> using namespace std; class Point { public: Point(int xx=0,int yy=0) { X = xx; Y = yy; } int GetX() { return X ; } int GetY() { return Y; } friend float fDist(Point &a,Point &b); private: int X,Y; }; float fDist(Point &p1,Point &p2) { double x = double(p1.X-p2.X); double y = double(p1.Y-p2.Y); return float(sqrt(x*x + y*y)); } int main(int argc, char* argv[]) { Point myp1(1,1),myp2(4,5); cout<<"The distance is:"; cout<<fDist(myp1,myp2)<<endl; return 0; }
运行结果:The distance is:5
友元函数是在类中用关键字friend修饰的非成员函数。
2、友元类
声明友元类,是建立类与类之间的联系,实现类之间数据共享的一种途径。若A类为B类的友元类,则A类的所有成员都是B类的友元函数,都可以访问B类的私有和保护成员。
第一、友元关系是不能传递的。B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何友元关系,不能进行数据共享。
第二、友元关系是单向的。如果声明B类是A类的友元函数,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。
第三、友元关系是不被继承的。如果类B是A类的友元,类B的派生类并不会自动成为类A的友元。打个比方,就好像别人信任你,但不见得信任你的孩子。
#include <iostream> using namespace std; class A { friend class B; public: void Display() { cout<<"I'm at A"<<endl; cout <<x<<endl; } private: int x; }; class B { public: void Set(int i); void Display(); private: A a; }; void B::Set(int i) { a.x=i; } void B::Display() { cout <<"I'm at B"<<endl; a.Display(); } int main(int argc, char* argv[]) { B b; b.Set(99); b.Display(); return 0; }
运行结果:I‘ m B
I'm A
99