c++第三次作业:类的友元

类的友元

为什么我们需要友元函数

私有成员无法从类外访问,但有时又需要授权某些可信的函数和类访问这些私有成员。友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。

  • 例如:私有函数成员无法从类外访问
Circle C1();   //Circle 类中包含radius变量
C1.radius = 1; //此时就会报错,因为无法调用radius变量
  • 关键字:friend(友元函数或友元类)

举个例子说明

#include<iostream>
using namespace std;
class Date{
	private:
		int year{2019} , month{10} , day{28};
	public:
		friend class kid;      //友元类
		friend void print(const Date& d);  //友元函数
};
void print(const Date& d){
	cout<<d.year<<"/"<<d.month<<"/"<<d.day<<endl;//引用了Date的私有成员
}
class kid{
	private:
		Date birthday;
	public:
		kid(){
			cout<<"I was born in "<<birthday.year<<endl; //在这里引用了Date类的私有成员year
		}
};
int main(){
	print(Date());
	kid k;
}

我们在Date类中设置了一个友元类kid,一个友元函数print,在类kid中引用了Date类的私有成员year;在函数print中也引用了Date类的私有成员,我们可以看到是可以成功的。
u1RprV.png

两个类可以互为友元函数吗?

我试了以下,刚开始发现后定义的友元类在第一个类中无法引用,后来将他们引用放在最后发现可以实现:

#include<iostream>
using namespace std;
class clock;  //事先说明,否则在第一个date类中认不出show2的参数
class date;  //这个其实可以不写

class date {
public:
	friend class clock;
	void show2(clock &B);      //我一开始在私有变量中写clock B发现无法识别,不得已只能作为参数了
private:
	int year = 2019, month = 10;
	int	day = 28;
};

class clock {            //这个类和上一个基本相同,只是变量名不同
public:                      
	friend class date;
	void show1(date &A);
private:
	int hour = 20, min = 50;
	int	sec = 13;

};
void clock::show1(date &A) {
	cout << A.year << endl;//引用了date类中的私有成员
}
void date::show2(clock &B) {//这个date类的函数成员必须写在最后,因为要用到B.hour的数据,写到前面发现认不得B;
	cout << B.hour << endl;//引用了clock类中的私有成员
}

int main()
{
	date A;
	clock B;
	clock myclock;
	date mydate;
	myclock.show1(A);//打印出年份2019
	mydate.show2(B);//打印出小时20
	return 0;
}

测试一下:

u1RuqK.png

我们发现两个类是可以互为友元的,但在定义后面的类为友元时,不可以调用这个还未写的这个类

posted @ 2019-09-28 22:19  醉死的乌鸦  阅读(327)  评论(0编辑  收藏  举报