友元是赋予了函数或者类一个访问权限,不是真正的声明
普通友元函数
仅是在类里friend了一个外部函数,并在外部定义实现了它
友元类
在class a1里声明了友元类(friend class a2)不需要再#include“a2.h”, 在class a2里要调用class a1的成员,需要进行#include“a1”
注:不能对两个类所在的头文件相互调用
类的友元成员函数(比较复杂)
- 先将会被声明为友元的类class a2进行编写,对它的内部函数(会被声明为类的友元成员函数)进行声明,不定义,注意需要对class a1;进行声明可能会在该内部函数声明中使用
- 将class a1进行编写,因为要声明类的友元成员函数,需要#include"a2" 在类里 friend class::func();
- 由于不能相互调用,所以在class a2.cpp中进行#include"a1.h", 在对各个a2类中的成员函数进行定义
补充:
若是本身想调用自己的友元函数,一定要记住友元函数的声明只是一个赋予权限的过程,并非真正的声明
所以想在本身中调用,必须先真正声明该友元
互为友元类:
#include<iostream>
using namespace std;
class People;
class Birth{
public:
friend class People;
// Birth() = default;
// ~Birth() { }
void getage(People &A);
private:
int year = 2019;
int month = 9;
int day = 10;
};
class People{
public:
friend class Birth;
// People()=default;
// ~People(){ }
void getyear(Birth b)
{
cout << b.year << endl;
}
private:
int age = 12;
char sex = 'M';
};
void Birth::getage(People &A){
cout << A.age << endl;
}
int main()
{
Birth b;
People p;
b.getage(p);
p.getyear(b);
return 0;
}