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
原文链接: https://www.cnblogs.com/haoyuanyuan/archive/2013/05/20/3088925.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/89214
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!