在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關鍵字是不是跟我們最初想把一些東西封裝和隱藏起來相矛盾呢?