将相似类型的成员变量组合在一起

时间:2008-11-28 12:59:03

标签: c++

编写类时,是否将成员相同类型的变量组合在一起?这样做有什么好处吗?例如:

class Foo
{
private:
    bool a_;
    bool b_;
    int c_;
    int d_;
    std::string e_;
    std::string f_;
    ...
};

相反:

class Bar
{
private:
    std::string e_;    
    bool a_;
    int d_;
    bool b_;
    std::string f_;
    int c_;    
    .

.. };

或者您只是按照添加顺序添加它们?

8 个答案:

答案 0 :(得分:12)

我根据语义对它们进行分组,即

class Foo
{
private:
    std::string peach;
    bool banana;
    int apple;

    int red;
    std::string green;
    std::string blue;
    ...
};

越可读,越好。

答案 1 :(得分:8)

您应该按照您希望它们初始化的顺序使用它们,因为这是它们将被初始化的顺序,而不管构造函数中的初始化列表如何。并非所有编译器都会警告您不一致。

答案 2 :(得分:2)

如果您关心对象的大小,并且编译器没有重新排序类中的成员(如果成员之间没有访问说明符,则不能重新排序),那么对象可能会来如果您从最大到最小的顺序订购会员,请小一些。原因是不太可能需要填充以满足对齐要求。这种排序将导致相同类型的成员更加紧密。

与代码清晰度相比,这通常会失败。与初始化顺序相比,当然它总是丢失(尽管你可以添加访问说明符并希望最好)。但你确实询问是否有任何的好处。

答案 3 :(得分:1)

  1. 语义分组。
  2. 如果你需要语义分组,那就是代码味道。提取一个类。幸运的是,相关成员已经在一个小组中,因此很容易选择合适的成员。

答案 4 :(得分:1)

史蒂夫麦康奈尔的代码完成,p762: -

  

明智的订单声明:...   按类型分组通常是明智的,因为相同类型的变量倾向于用于相关操作   ......如果您的变量列表是这样的话   字母顺序有助于   你的日常工作可能太大了。

另外,在上一页中,他介绍了我之前回答的风格,显示多个声明“拥挤”到一行......

bool a_, b_, c_;

...带有“编码恐怖”图标。所以我正在重新考虑这种方法。感谢评论者让我重新评估这个。

答案 5 :(得分:0)

在大多数情况下,结构中不应包含太多成员。

如果你这样做,也许你应该考虑子结构......

我知道有例外,但作为一般经验法则,尽量保持结构小。

答案 6 :(得分:0)

按有效优先顺序排列:

0)IF成员在构造之间存在依赖关系或者如果成员需要按特定顺序构建:按照您希望被构建的构造顺序声明它们。在建设中,成员构建的唯一顺序是班级中的成员顺序。

0.5)如果类实例对象大小很重要(你想要这种类型的最小大小 - 但不要做早期优化!),对于一些编译器,最好按大小顺序订购你的成员,第一个大于字节对齐或编译时的其他类似行为。

1)首先优先考虑CLARITY:首先为读者​​写(明确,在主题/目的组中排序等),然后为编译器(可能遵循先前的建议)。

几乎在所有情况下,只有1)是重要的。首选主题,目的和“同一系统的组合”,用于按成员分组成员。

注意:如果您按系统对成员进行分组,并且您发现有很多组,那么您可能应该将这些系统封装在类中。

答案 7 :(得分:0)

我同意其他人关于对变量进行排序的一些原因,但除此之外,我希望看到对于类在开头附近运行最重要的变量,以及在结束时不太重要的变量。如果你有其他理由来覆盖这个,那很好,但是当其他事情失败时,那就是我所做的。

当然,这通常是通过按照它们发生的顺序声明变量来实现的。最重要的变量是我首先想到的变量,以及我在实际编写类实现时遇到的其他变量。