1.友元函数
上图的number1和number2被private给保护了起来,以至于print不能访问。
有没有什么办法能让print(const Date& d1)能够访问number1和number2 ?
让print()在类中声明,并且在前面加上关键字 friend 加上关键就说明这个函数是这个类的友元函数。
运行结果
通过这样的方式便能访问类private的成员变量
友元函数并不属于类,只是一种声明权限,它可以访问类的private的成员。
#include<iostream>
using namespace std;
class Date{
friend void print(const Date& d1);
public:
private:
static int number1;
static int number2;
};
int Date::number1 = 10;
int Date::number2 = 20;
void print(const Date& d1){
cout << d1.number1 << " " << d1.number2 << endl;
}
int main(){
Date D1;
cout << sizeof(D1) << endl;
return 0;
}
一个函数可以是多个类的友元函数
#include<iostream>
using namespace std;
class BB;
class AA{
friend void print(const AA& d1, const BB& d2);
public:
private:
int number1 = 10;
int number2 = 20;
};
class BB {
friend void print(const AA& d1, const BB& d2);
public:
private:
int number1 = 30;
int number2 = 40;
};
void print(const AA& A,const BB& B){
cout <<A.number1<< endl;
cout <<B.number1<< endl;
}
int main(){
AA A;
BB B;
print(A, B);
return 0;
}
看上面的代码,void print()是一个函数,它在两个类里面都有友元声明,所以它能用两个类里面的private的成员变量。
运行结果
2.友元类
假如有两个类一个是AA,一个是BB,如果在BB中声明AA是它的友元类,那么AA就可以调用它的private的成员
#include<iostream>
using namespace std;
class BB {
friend class AA;
public:
private:
int bb1 = 30;
int bb2 = 40;
};
class AA{
public:
void print(const AA& A, const BB& B) {
cout << A.aa1 << endl;
cout << B.bb1 << endl;
}
private:
int aa1 = 10;
int aa2 = 20;
};
int main(){
BB B;
AA A;
A.print(A, B);
return 0;
}
看上述代码,AA是BB的友元类,所以AA可以调用BB的成员。
注意:我们需要在AA之前声明BB是一个类,这就是前置声明
友元类具有单向性,AA可以是BB的友元函数,但BB不能同时是AA的友元函数
友元关系不能传递,比如AA是BB的友元类,BB是CC的友元类,但AA不是CC的友元类