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的友元。

posted @ 2019-09-27 19:38  罗斯柴尔德  阅读(152)  评论(0编辑  收藏  举报