在C++中,如果以一个类想允许不属于当前类的成员函数访问该结构中的私有或保护数据时,那该怎么办呢?
这时可以用上friend这个关键字。例如:
class A;//Declaration
class B
{
public:
void fun(A *a);
};
class A
{
private:
int i;
public:
void initialize();
class D
{
private:
A *h;
public:
void initialize();
}
friend void g(A *a,int i);
friend void B::fun(A *a);
friend class C;
friend void h();
friend A::D;
};
void X::initialize()
{
i = 0;
}
void g(A *a,int i)//全局函数g直接访问了类A的私有成员
{
a->i = i;
}
void B::fun(A *a)//类B的成员函数直接访问了类A的私有成员
{
a->i = 47;
}
class C
{
private:
int j;
public:
void initialize()
void g(A *a);
};
void C::initialize()
{
j = 99;
}
void C::g(A *a)//类C的成员函数g直接访问了类A的私有成员
{
a->i = j;
}
void h()//全局函数h直接访问了类A的私有成员
{
A a;
a.i = 100;//
}
void A::D::initialize()//访问A的私有变量i
{
h->i = 10;
}
void main()
{
A a;
C c;
c.g(&a);
}
通过上面的例子,我们可以看到直接访问类A的私有成员i的方法。但是,由此我想到,
当我们发布我们自己的C++库的时候,比如我们有这样一个库(含有tools.h,tools.lib,tools.dll三个文件)
头文件定义:
class CTools
{
private:
int m_nId;
int m_nSize;
...
public:
...
};
我们的目的想让像m_nId,m_nSize这样的私有变量隐藏起来,但是有一个用户在使用我这个库的时候,
只要他用friend关键字稍作修改就可以直接访问我们的私有变量了。如下:
class CTools
{
friend class CUser;
private:
int m_nId;
int m_nSize;
...
public:
...
};
这样的话,friend关键字是不是跟我们最初想把一些东西封装和隐藏起来相矛盾呢?