一个班级可以有两个公共部分吗?如果是,那为啥?我们在啥情况下这样做?
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 向导生成的代码。每当您使用向导向您的班级添加一些东西时,它只会在您的班级末尾添加一个额外的部分。
【讨论】:
以上是关于一个班级可以有两个公共部分吗?如果是,那为啥?我们在啥情况下这样做?的主要内容,如果未能解决你的问题,请参考以下文章