一个班级可以有两个公共部分吗?如果是,那为啥?我们在啥情况下这样做?

Posted

技术标签:

【中文标题】一个班级可以有两个公共部分吗?如果是,那为啥?我们在啥情况下这样做?【英文标题】:Can there be two public section in a class? If yes then why ? And in which circumstances we do so?一个班级可以有两个公共部分吗?如果是,那为什么?我们在什么情况下这样做? 【发布时间】:2011-02-12 18:16:17 【问题描述】:

有一些关于课程的问题困扰着我。例如

class A

public:
  A()
  
  .....
  .....
  

  void cleanup()
  
  ....
  ....
  ....
  

public:
  UINT a;
  ULONG b;
;

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

【问题讨论】:

您的课程只有一个公共部分(中间还有一个不必要的附加 public 说明符)。 【参考方案1】:

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

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

【讨论】:

+1 不同访问说明符标签中未指定的成员布局是一个重要的细节。 我很感兴趣。 gcc 抱怨在初始化列表中,两个属性的初始化顺序与它们声明的顺序相反,这会受到影响吗? 它抱怨是因为属性是按照它们在类声明中出现的顺序初始化的(尽管我不清楚这如何跨访问限定符工作)。如果初始化列表的顺序不同,可能会产生误导。 如果你有一些私有的东西依赖于公共的东西,而公共的东西依赖于私有的东西,那么重复部分是有意义的。当你有很多 typedef 和 enums 时会发生这种情况【参考方案2】:

正如 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:
;

随意想出你自己的风格,无论你喜欢什么。没有正确或错误的做法。尽量保持一致。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我通常会尽量安排类的声明,以便其他人使用该类。

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

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

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

不过有几个技巧:

在使用元模板编程时,你可能需要先声明类型,然后声明方法,所以你最终得到了2系列public/protected/private 当使用 Key 成语(而不是 friend)时,您有一个 public 部分,实际上它仅用于一小部分用户,最好在普通public 部分的底部或protected 部分之后。

最后,关于属性中layout问题的评论。封装意味着属性应该是private。所以,要么你有一个 struct 并且所有东西都是 public 或者你有一个类并且所有东西都是 private ,将两者混合意味着破坏封装,这是一个正在形成的错误。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于一个班级可以有两个公共部分吗?如果是,那为啥?我们在啥情况下这样做?的主要内容,如果未能解决你的问题,请参考以下文章

PADS多个元件重叠,如何选中其中一个,为啥我只能选中最大的那一个,谢谢

禁用443端口还能访问https吗?如果不能那为啥还要禁用

位运算符更快吗?如果是,那为啥?

为啥我们不能在 C 语言中拥有两个主要功能?

类的公共成员及其访问

处理公共区域的多个地理围栏过渡