【问题标题】: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 说明符)。

标签: c++ class 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 向导生成的代码。每当您使用向导向您的班级添加一些东西时,它只会在您的班级末尾添加一个额外的部分。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-29
            • 1970-01-01
            • 2016-05-26
            • 2012-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多