友元(friend)是C++独有的特性,如果函数或者类被另一个类指定为友元函数或者友元类,那么在前者的类或者函数中可以利用后者的对象访问到后者的私有变量。
例如:
class TestFriendClass;
class FriendClass{
public:
void test(TestFriendClass &c);
};
class TestFriendClass{
private:
string name;
int age;
public:
TestFriendClass():age(10),name("")
{
}
friend void FriendClass::test(TestFriendClass &c);
};
void FriendClass::test(TestFriendClass &c)
{
c.age = 30;
}
如果在某个类中将类或者非成员函数声明为友元,那么该类和函数将会有全局作用域。
class X{
friend class Y; //1
friend void f(); //2
};
class Z{
Y *num; //3
void g (){
::f(); //4
}
};
上面的代码如果将friend关键字去掉,代码将被编译出错。
对于1,2来说,如果去掉friend关键字3,4将出错,因为在这之前Y和f都没有被声明或者定义过。
所以如果在某个类中将类或者非成员函数声明为友元,那么该类和函数将会有全局作用域,究其原因是因为该类或者非成员函数被变相声明了。