友元函数、友元类
“友元”是独立的,与类之间不存在包含关系。通过“友元”的声明,可以访问类中的任何成员。
友元函数
友元函数不是这个类中的成员函数,只是一个普通的小可爱:在类体外声明、在类体外实现,跟普通的函数完全一样,不过需要在类体内“登记”一下,表示这个函数有权限访问类体内的所有成员。登记的格式是:
friend 函数(参数);
class Date{
private:
int y,m,d;
public:
Date(){
y=1314,m=5,d=21;
}
//友元函数登记:
friend void Print(Date a);
friend void changeY(int Y,Date &a);
friend int getM(Date a);
//注意这里登记的函数必须和下面的函数一模一样
//即参数个数、类型、名字都必须完全相同
};
void Print(Date a){
cout<<a.y<<" "<<a.m<<" "<<a.d<<endl;
}
void changeY(int Y,Date &a){
a.y=Y;
}
int getM(Date a){
return a.m;
}
int main( )
{
Date d0;
Print(d0);//像普通函数一样调用
changeY(1413,d0);
Print(d0);
cout<<getM(d0);
return 0;
}
输出:
1314 5 21
1413 5 21
5
友元函数的参数一般包括相应类的对象,比如上述三个友元函数里的Date a
,不然没对象光有权限有啥用哈哈哈哈哈
把友元函数当成普通函数用就可以,像普通函数一样定义、一样描述、一样调用,只是多了一个“登记”的步骤。
友元类
一个类作为另一个类的友元,则这个类中所有成员函数都是另一个类的友元函数。“登记”格式:friend class 类名;
class Date{
private:
int y,m,d;
public:
Date(){//打酱油的构造函数
y=1314,m=5,d=21;
}
friend class Print;//友元类登记
};
class Print{
public:
//Print类的成员函数都是Date类的友元函数
void printY(Date p){
cout<<p.y;//有访问私有成员y的权限
}
};
int main( )
{
Date p;
Print p0;
p0.printY(p);
return 0;
}
输出:
1314
本人是在读大学生,系列教程主要为了便于我的同学们参考,其中可能有很多不妥之处,望各位大佬雅正。
公众号:网织青春zcwlgc2019