【问题标题】:C++ encapsulation, how is it usefulC++封装,有什么用
【发布时间】:2020-05-11 00:13:49
【问题描述】:

下面的幻灯片是指 C++ 语言,它说

“封装是为了确保用户以安全的方式使用我们的 ADT”

但是,如果他可以访问我的 .h 文件,例如,他可以编辑它并将我的类中声明的内容从私有更改为公共。

例如:

我的文件.h:

class Complex {
private:
    double re, im;
public:
    double get_re();
};

然后用户可以写:(从私有更改为公共之后)

Complex s1;
s1.re=13;

请点击以下链接查看图片(因为我没有必要添加图片): enter image description here

【问题讨论】:

  • 目标是让犯错更难。你不能让它成为不可能。不管你如何让一个系统万无一失,总会有更好的傻瓜,所以你不妨把精力花在别处。

标签: c++ class encapsulation


【解决方案1】:

使用 C++,您可以通过多种方式击中您的脚。你也可以使用

#define private public

并且您无需更改代码中的任何内容即可访问私有接口...这里的重点不是如何破坏封装,而是关于您使用它实现的目标。

当您必须在classstruct 之间进行选择时,您必须考虑是否要用它来表示什么,并且如果该事物具有不变量,那么您应该使用类,否则应该使用结构:封装将允许您使用封装实现“不变”,因此让用户访问数据,或仅使用您定义的公共接口设置/修改数据,而不是他想要的方式。

例如,如果你定义一个类Date,你有一个不变量,比如“max 31 as day, max 12 as month ...”,但是如果你想定义例如DifferenceInDays,它将有days 只是一个 int,而不是您可以允许用户在该结构中读取和写入他想要的任何内容,因为您没有任何不变量

【讨论】:

  • You can also use #define private public "can" 在某种意义上,这样做在技术上会导致未定义的行为。
  • 所以如果我理解正确,用户总能找到打破私有限制的方法,但无论如何我们都会使用它来让他知道最好不要直接访问该值,对吧?跨度>
  • structclass 之间的唯一 区别在于默认访问权限。如果没有访问说明符,则struct 的成员是公共的,class 的成员是私有的;同样,如果基址没有访问说明符,struct 会公开继承该基址,class 会私下继承它。
  • @PeteBecker 但这不是我的问题,请先阅读我对两个 cmets 的总结
  • @clark_smith1 — 我没有回答你的问题。我在评论答案。
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2018-07-27
  • 2013-10-20
  • 2012-12-04
  • 1970-01-01
  • 2016-10-15
  • 2011-04-08
相关资源
最近更新 更多