分享知识

与大家一起分享知识

C++博客 首页 新随笔 联系 聚合 管理
  19 Posts :: 3 Stories :: 45 Comments :: 0 Trackbacks

在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关键字是不是跟我们最初想把一些东西封装和隐藏起来相矛盾呢?

posted on 2006-04-03 15:06 史传红 阅读(511) 评论(2)  编辑 收藏 引用 所属分类: C/C++细节知识

Feedback

# 谢谢 2006-04-05 09:29 甘霖
偶是个初学者,给了我一些帮助,相当感谢楼主。  回复  更多评论
  

# re: 对C++中友元的思考 2007-10-29 22:22 范围
感谢,很有帮助啊!!!  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理