-1

就像在 Qt 中一样,我在 QPoint 类中看到了。它使用 QPoint.x() 来获取和使用 QPoint.setX() 来设置。为什么不直接使用 x 作为公共变量?我知道有些书推荐它,但它的深层原因是什么?而且有时不太方便。

4

2 回答 2

3

这样做有三个基本原因。

  1. 抽象。您的用户不应该知道或关心x是按价值存储还是每次都计算。也许您存储一个盒子的上 x 坐标及其宽度,并计算xmax_x - width. 也许您在 3.4 版本中更改了存储数据的方式。
  2. 一致性。您的用户不必记住在将宽度调用为函数 ( ) 时将其调用x为变量 ( )。所以让它变得简单,并将一切(在合理范围内)作为一个函数。myobject.xmyobject.width()
  3. 控制。也许x只允许是积极的,甚至,或者当你改变时xupper_x也需要改变。使用 setter/getter,您可以强制执行所有这些操作。
于 2013-03-27T00:27:47.277 回答
1

创建成员private并使用 getter 和 setter 访问它的三个常见原因:

  1. 您需要对成员保持一些不变性。也就是说,如果成员可以拥有使您的对象无效的某些值,则您要确保客户端不能仅根据自己的意愿对其进行修改。如果您没有不变量, Stroustrup 建议使用 astruct

  2. 您希望接口以某种不同的形式公开成员。一个例子是,如果您存储 a PersondateOfBirth但您想通过成员函数公开它getAge()。年龄是根据出生数据计算的,但您不希望客户dateOfBirth直接访问。

  3. 在未来的某个时候,前两点中的一个或两个可能会成为现实。

如果我正在实施 a Point,我会使其成为 astruct并拥有xy成为公共成员。根本没有无效的东西Point,我无法想象坐标将需要从其他表示中计算出来。Qt 开发人员显然做出了不同的决定。

于 2013-03-27T00:25:41.537 回答