【转】C++ friend存在的意义
2013-02-20 16:42
267 查看
C++区看到网友讨论,其中说的比较清晰的是dingqiang107,特转过来
友元只对特定目标开放,而public对所有目标开放,两者作用不同,不可相互替代。你举的这个例子是不对的。只允许部分类或函数访问自己的私有成员,其它人不行,这件事非友元不能做。
友元并没有破坏封装。将何人设成友元,或者说允许谁来访问本类的私有成员,完全是由本类的作者决定的,如同将哪些成员设成公共成员一样。public控制开放哪些成员,friend控制开放的目标,是控制的两种表现形式,并不是对立的,所以从概念上讲并没有破坏封装。
所谓“封装”,并不是说把所有的东西都包起来不给别人看,而是指有控制的允许一些人看到一些东西,强调的是“控制”,而不是“隐藏”。有“隐藏”必有“开放”,否则就谈不上封装了,关键在于作者能不能控制这种开放。有的语言不能控制,就说它不具有“封装”特性,有的语言能够控制,就说它具有“封装”特性。
C++的“封装”特性是指其能够“控制开放”,友元只是细化这种控制,并没有失去控制,所以并没有破坏“封装”。类似还有protected,只允许特定目标访问特定成员,也是对“封装”的细化,都在类的作者的控制之下。
最初曾考虑过将friend进一步细化到控制单独的成员,也就是说同时控制开放成员与目标,不过语法上太别扭了,所以现在friend作用于所有成员,public作用于所有目标。
友元只对特定目标开放,而public对所有目标开放,两者作用不同,不可相互替代。你举的这个例子是不对的。只允许部分类或函数访问自己的私有成员,其它人不行,这件事非友元不能做。
友元并没有破坏封装。将何人设成友元,或者说允许谁来访问本类的私有成员,完全是由本类的作者决定的,如同将哪些成员设成公共成员一样。public控制开放哪些成员,friend控制开放的目标,是控制的两种表现形式,并不是对立的,所以从概念上讲并没有破坏封装。
所谓“封装”,并不是说把所有的东西都包起来不给别人看,而是指有控制的允许一些人看到一些东西,强调的是“控制”,而不是“隐藏”。有“隐藏”必有“开放”,否则就谈不上封装了,关键在于作者能不能控制这种开放。有的语言不能控制,就说它不具有“封装”特性,有的语言能够控制,就说它具有“封装”特性。
C++的“封装”特性是指其能够“控制开放”,友元只是细化这种控制,并没有失去控制,所以并没有破坏“封装”。类似还有protected,只允许特定目标访问特定成员,也是对“封装”的细化,都在类的作者的控制之下。
最初曾考虑过将friend进一步细化到控制单独的成员,也就是说同时控制开放成员与目标,不过语法上太别扭了,所以现在friend作用于所有成员,public作用于所有目标。
相关文章推荐
- C++静态数据成员存在的意义
- 探究c++智能指针中auto_ptr_ref的存在意义
- C++的命名空间的现实意义
- 没有抽象方法的抽象类,存在什么样的意义呢?
- T-SQL应用之表变量存在的意义
- 垂直搜索引擎的存在意义
- iterator_traits 存在的作用与意义
- C/C++中判断某一文件或目录是否存在
- 了解typename的双重意义(Effective C++_42)
- 【effetive C++ 笔记 】条款23:宁以non-member, non-friend替换member函数
- friend function in C++
- 我认为接口存在的意义
- 链表头结点存在的意义【转】
- C++存在重定义的解决办法
- C++中的friend友元函数详细解析
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- c++中_T的意义——20110505
- json的存在意义(json和String的区别)
- 8、C++的转义字符意义
- 书存在的意义,就是等待着被烧毁