0.友元简介
(1)友元存在的意义
(2)友元的用法
- 在类中以friend关键字声明友元
- 类的友元可以是其它类或者具体函数
- 友元不受类中访问级别的限制
- 友元可以直接访问具体类的所有成员
在类中声明友元后,那么代表了这个友元类或函数就是这个类的朋友。就可以直接访问这个类的所有成员(分享所有秘密)。
1.友元分类
1.1 友元函数
#include<iostream>
#include<cmath>
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()
{
...
}
1.2 友元类
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
关于友元类的注意事项:
- 友元关系不能被继承。
- 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
- 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
#include <iostream>
using namespace std;
class A
{
public:
friend class C; //这是友元类的声明
private:
int data;
};
class C //友元类定义,为了访问类A中的成员
{
public:
void set_show(int x, A &a)
{ a.data = x; cout<<a.data<<endl;}//这里访问了A类的私有成员
};
int main(void)
{
class A a;
class C c;
c.set_show(1, a);
return 0;
}
1.3 友元成员函数
使类B中的成员函数成为类A的友元函数,这样类B的该成员函数就可以访问类A的所有成员了。
#include <iostream>
using namespace std;
class A; //当用到友元成员函数时,需注意友元声明与友元定义之间的互相依赖。这是类A的声明
class B
{
public:
void set_show(int x, A &a); //该函数是类A的友元函数
};
class A
{
public:
friend void B::set_show(int x, A &a); //该函数是友元成员函数的声明
private:
int data;
void show() { cout << data << endl; }
};
void B::set_show(int x, A &a) //只有在定义类A后才能定义该函数,毕竟,它被设为友元是为了访问类A的成员
{
a.data = x;
cout << a.data << endl;
}
int main()
{
class A a;
class B b;
b.set_show(1, a);
return 0;
}