c++第三次作业
类的友元
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
友元函数
友元函数可以是一个普通的函数,也可以是其他类的成员函数。虽然他不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有成员。
如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,实例:
//C++语言程序设计第四版 P160 例5-6
//求两点之间的距离
#include "pch.h"
#include<iostream>
using namespace std;
class Point
{
public:
Point(int x = 0, int y = 0) :x(x), y(y) {}
int getX() { return x; }
int getY() { return y; }
friend float dist(Point &p1, Point &p2);
private:
int x, y;
};
float dist(Point &p1, Point &p2)
{
double x = p1.x - p2.x;
double y = p1.y - p2.y;
return static_cast<float>(sqrt(x*x + y * y));
}
int main()
{
Point myp1(1, 1), myp2(4, 5);
cout << "The distance is:" << endl;
cout << dist(myp1, myp2) << endl;
return 0;
}
程序运行结果为 :
在Point类中只声明了类友元函数的原型,友元函数dist的定义在类外。可以看到在友元函数中通过对象名称直接访问了Point类中的私有成员x和y。
友元类
同友元函数一样,一个类可以将另一个类声明为友元类。若A类为B类的友元类,则A类所有的成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
声明友元类的语法形式为:
class B
{
...
friend class A;
...
};
实例:
//Bclass访问Aclass的私有成员
#include "pch.h"
#include<iostream>
using namespace std;
class Aclass
{
public:
Aclass(int aa);
friend class Bclass;
private:
int a;
};
Aclass::Aclass(int aa)
{
a = aa;
}
class Bclass
{
public:
Bclass(int bb);
void getA(Aclass a) {
cout << "a.a=" << a.a << endl;
}
private:
int b;
};
Bclass::Bclass(int bb)
{
b = bb;
}
int main()
{
Aclass a(5);
Bclass b(6);
b.getA(a);
return 0;
}
运行结果:
实例中我们可以看到Bclass的函数getA直接访问了Aclass私有成员的a。
使用注意事项
1、友元关系是不能传递的。B是A的友元,C是B的友元,如果没有声明,C和A没有任何友元关系。
2、友元关系是单向的。B声明是A的友元,B可以访问A的私有成员,而A不能访问B的私有成员。
3、友元关系是不能被继承的。B是A的友元,B的派生类不会自动生成为A的友元。