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类的私有成员,我们可以看到是可以成功的。
两个类可以互为友元函数吗?
我试了以下,刚开始发现后定义的友元类在第一个类中无法引用,后来将他们引用放在最后发现可以实现:
#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;
}
测试一下:
我们发现两个类是可以互为友元的,但在定义后面的类为友元时,不可以调用这个还未写的这个类