15

有一些关于课程的事情困扰着我。例如

class A
{
public:
  A()
  {
  .....
  .....
  }

  void cleanup()
  {
  ....
  ....
  ....
  }

public:
  UINT a;
  ULONG b;
};

在上面的例子中有两个公共部分。在第一节中,我定义了一个构造函数和一个方法,在第二节中,我声明了数据成员。以上类即A是否正确。我们可以这样做吗?如果是,那么为什么需要它,我们应该在什么情况下使用它?既然我们可以在一个部分中完成整个事情,那么为什么会有两个部分呢?

4

6 回答 6

30

访问限定符仅适用于下一个限定符之前的代码。此类限定词的数量或顺序没有限制。

通常没有必要在一个类中重复相同的访问限定符,这样做可能会使读者感到困惑。它们也可能对类的布局产生影响,因为遵循相同限定符的数据成员必须按照它们声明的顺序进行布局,但限定符之间没有这种限制。

于 2010-04-27T08:13:38.073 回答
13

正如 Marcelo 所说,您可以根据需要多次使用公共、私有和受保护的限定符。“何时”完全是个人的。有些人是这样的:

class AClass
{
public:
   // all the public stuff
protected:
   // all the protected stuff
private:
   // all the private stuff
};

但就个人而言(这实际上只是个人喜好)我喜欢这样做:

class AClass
{
   // constructors and destructors
public:
   // public cons/dest
protected:
   // protected cons/dest
private:
   // private cons/dest

   // accessors
public:
protected:
private:

   // methods
public:
protected:
private:

   // members
public:
protected:
private:
};

随意想出你自己的风格,无论你觉得舒服。没有正确或错误的做法。试着保持一致。

于 2010-04-27T08:19:18.327 回答
6

是的,它是正确的,但是我个人更喜欢在类的顶部有一个公共部分,这是程序员在检查新类时首先看的地方。然后更容易看到哪些部分应该是可访问的,哪些不是 - 而不是浏览整个类头。

于 2010-04-27T08:24:49.963 回答
4

我通常会尝试安排类的声明,以便其他人可以轻松使用该类。

通常是这样的:public/protected/private,按此顺序,因为它简化了读者的生活。

  • 使用该类的人可以在到达protected标签后停止阅读,之后的任何事情都与他们无关。
  • 从类派生的人一旦到达private标签就可以停止阅读,之后的任何内容都是实现细节。

再加上不在声明点编写方法的代码,这使得界面易于阅读。

但是有几个技巧:

  • 在使用元模板编程时,您可能需要先声明类型,然后再声明方法,因此您最终会得到 2 系列public/protected/private
  • 当使用Key idiom(而不是friend)时,您有一个public实际上只专用于一小部分用户的部分,最好在普通public部分的底部或在该protected部分之后隔离。

Finally, as to comment about the layout issue among the attributes. Encapsulation means that attributes should be private. So, either you have a struct and everything is public or you have a class and everything is private, mixing the two means breaking encapsulation, and that's a bug in the making.

于 2010-04-27T15:23:49.190 回答
2

类是正确的,public 只是一个访问限定符,将一直应用到看到下一个限定符或类声明结束。您可以在一个类中拥有多少个这些访问限定符(公共、私有、受保护)没有限制。至于为什么这很有用,它有助于以您想要的方式编写类声明。例如,我可能希望在(比如说)私有数据成员之前声明所有成员函数(公共的、受保护的或私有的)。

于 2010-04-27T08:17:04.573 回答
2

正如@Marcelo Cantos 的回答所解释的,这是允许的。当你自己编写代码时,你应该避免这种情况,因为它只会在其他人阅读你的代码时导致混乱。我在现实生活中唯一见过的地方是各种 MFC 向导生成的代码。每当您使用向导向您的班级添加一些东西时,它只会在您的班级末尾添加一个额外的部分。

于 2010-04-27T08:58:11.407 回答