友元函数:
通常一个成员函数只可对它所在类的数据成员进行访问,如果要同时访问多个类的数据成员(包括私有成员),可在这些类中都声明一个友员函数。友员函数的声明是使用关键字"friend"作为开头,具体的位置不受private|protected|public访问控制影响,友员函数的定义和调用,不需要用"类名::"做前缀,因为友员函数是独立于各个类的。
测试代码(1)
#include<iostream>
using namespace std;
class B;//先声明,check函数用到此类
class A
{
bool bfinish;
friend bool check(A a, B b);//声明check为类A的友元函数
public:
A(bool b){bfinish = b;}
};
class B
{
bool bfinish;
friend bool check(A a, B b);//声明check为类B的友元函数
B(bool b){bfinish = b;}
};
bool check(A a, B b){ //定义
if(a.bfinish&&b.bfinish) return true;
else return false;
}
int main(int argc, char* argv[])
{
A a(true);
B b(false);
if(check(a,b)) cout<<"bfinish¶¼ÊÇtrue"<<endl;
else cout<<"bfinish²»¶¼ÊÇtrue"<<endl;
return 0;
}
测试代码(2)
代码运行有错,也操作符重载有关。
友元类:
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。