请各位讨论一下封装性

Heray 2004-06-26 12:31:30
如果把一个对象的指针进行强制类型转换,就能随意访问到它的所有成员变量,包括私有和保护的成员变量,这样的话,类的封装性根本就没法真正的保障,那么,作为面向对象的三大特性,封装性到底有什么意义呢?
...全文
204 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenyiwen 2004-06-28
  • 打赏
  • 举报
回复
封装是为了使接口和实现分离,而不是为了方便。实际上封装往往会降低使用的方便度。
但是接口和实现分离,使得内部实现的修改不影响外部的调用者,从而提高程序对修改的适应度。

一种方法可以实现完全封装,即使强制转换也无用。

在头文件中声明:
class A {
public:
void method();
// ...
private:
friend struct A_Impl;
A_Impl* impl;
};

然后在源文件中声明:
struct A_Impl {
// all A's data members...
};

void A::method() { // ... }

//...

所有的数据成员都放到 A_Impl 的结构中,这样 A 的数据成员对外界完全不可见。
此法对大工程里提高编译速度较有用。
toxyboy 2004-06-28
  • 打赏
  • 举报
回复
继承纯虚基类。只暴露外部公用接口。
meijing 2004-06-27
  • 打赏
  • 举报
回复
???? 不敢苟同:
1。面向对象的意义就在于对象的共享
2。如果开发出来的对象或者组件只是为本地使用的话,
程序员根本就没必要设计面向对象的程序
Heray 2004-06-27
  • 打赏
  • 举报
回复
面向对象的意义就在于对象的共享,这也是多态和继承特性的目的,同时为了保护共享的安全,又引入了封装这个概念。如果开发出来的对象或者组件只是为本地使用的话,程序员根本就没必要设计面向对象的程序,事实上,很多人写的C++代码只能称得上带类的C,根本也不会去考虑封装继承什么的,我这个帖子讨论的当然也不是针对这些程序的。
meijing 2004-06-27
  • 打赏
  • 举报
回复
封装等等概念都是为了开发方便,不是为了防黑客。
所以没有必要去防范故意的破坏。
--如果程序员自己要破坏封装性,
更简单的办法是不要封装,而不是强制类型转换

强制类型转换为了满足特殊需要而设的。
tuqvb 2004-06-27
  • 打赏
  • 举报
回复
作强制类型转换就能访问到类的私有成员?给个例子吧

要彻底保护私有成员的内存,最好的做法是在外部可见的声明中只包含接口
隐藏内部的内存操作细节。然而在c++中很难做到这一点,因为通常在class
的声明中包含了这个class的所有内部操作的对象。私有对象即使理念上不允
许外部直接访问,但却仍然放入头文件中对外部暴露,这一点确实是c++的不足
Heray 2004-06-26
  • 打赏
  • 举报
回复
面向对象设计方法相比面向过程的革新性的意义,就在于它的三大特性,而花了这么多工夫定义了三种不同的访问权限,其目的应该不仅仅是为了形式上的限制吧?
通过强制类型转换的方式应该说是一种最最基本的办法了,根本谈不上什么特殊的手段,更与黑客解密的手段相差甚远,至于到核子武器这个层面更是没法相提并论了。事实上,我觉得,要做到彻底的封装,保护私有成员变量的内存不被访问,应该不是什么难事情吧?
njSeeWhy 2004-06-26
  • 打赏
  • 举报
回复
如果你故意要去破坏封装,那什么机制也无法保证绝对的封装性,就算编译成二进制代码,再用上N复杂的加密算法加密,理论上也是可以访问到其内部成员的。呵呵
xjp6688 2004-06-26
  • 打赏
  • 举报
回复
up
myxs 2004-06-26
  • 打赏
  • 举报
回复
aixuer 2004-06-26
  • 打赏
  • 举报
回复
我也不知道,不过这个问题我有兴趣。

帮你顶一下啊。
nscboy 2004-06-26
  • 打赏
  • 举报
回复
我觉的封装的目的在于把问题简单化,为了可以实现更强大,更复杂的软件.把问题局部话,便于检查和解决.
可以提高开发的效率.

举个例子吧.
我要组装一台电脑,只要买来主机箱,cpu,硬盘,光驱,主机板,内存,显示器就可以了.
那我就没有必要从开采提炼单晶硅开始做起.即使电脑的光驱坏了,我也只需要把光驱拆下了,换一个就行了,没有必要把整台电脑都扔了,全部换新的.


对于你说的强制类型转换,我也举一个例子来说明:
一般来讲,我们认为把钱放到银行的保险柜里面是比较安全的.
但是当你碰到了一个强大的超人.他动用包括核子武器在内的一切武器来工具银行时,请问你的钱还安全吗?
kaphoon 2004-06-26
  • 打赏
  • 举报
回复
java推出时,说c++的指针是个bug,也就是这个原因.
但是c++没有指针,那算什么呢?
真如楼上讲的.
故意的破坏,就没什么意思拉

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧