目录
1、概述
友元关系提供了不同类或对象的成员函数之间,类的成员函数与一般函数之间进行数据共享的机制。 通俗的说,友元关系就是一个类主动声明哪些其他类或函数进而给它们提供了对本类的特许访问(访问封装于本类的数据)。
2、友元函数
友元函数是类中用关键字friend修饰的非成员函数。友元函数可以是一个普通函数,也可以是其他类的成员函数。
虽然它.的成员函数,但是在它的函数体中可以通过对象名访问本类的私有和保护成员。
3、友元函数-实例(计算两点间的距离)
Point类的定义,dist函数声明为友元函数
// Point类的定义
class Point {
private:
int xx;
int yy;
public:
Point(int x = 0, int y = 0) :xx(x), yy(y) {
cout << "Constructor of Point." << endl;
} //构造函数
Point(const Point& p) {
xx = p.xx;
yy = p.yy; //复制构造函数
cout << "Copy Constructor of Point." << endl;
}
~Point() {}
int getX() { return xx; };
int getY() { return yy; };
friend float dist(Point a,Point b); // 在类中声明为友元函数
};
dist函数的定义
float dist(Point a,Point b) { //(这里传递应用更好)声明为友元函数后直接调用私有成员
int x = a.xx - b.xx;
int y = a.yy - b.yy;
return static_cast<float>(sqrt(x * x + y * y));
}
主函数实现
int main()
{
Point a(1, 1), b(4, 5);
Point c(b);
cout << "the len of ac is:" << dist(a, c);
}
运行结果
4、友元类
同友元函数一样,一个类可以被另一个类声明为友元类。若类A为类B的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有成员和保护成员。
5、友元类实例
// 沿用上述Point,在Point类中增加一条语句:friend class Line; 的前提下
class Line {
private:
double len;
public:
Line(Point p1,Point p2) // 构造函数,直接访问利用Point类的私有数据成员进行构造。
{
double x = p1.xx - p2.xx;
double y = p1.yy - p2.yy;
len= static_cast<float>(sqrt(x * x + y * y));
}
double getLen() {
return len;
}
~Line() {}
};
主函数
int main()
{
Point p1(1, 2);
Point p2(4, 6);
Line L(p1, p2);
cout << "the len of the L is:" << L.getLen();
}
运行结果
6、总结
关于友元,还需注意以下几点:
- 友元关系是不能传递的
- 有缘关系是单向的
- 友元关系是不被继承的
这里具体解释一下第3条:友元关系是不被继承的,如果类B是类A的友元,类B的派生类并不会自动成为类A的友元。