编写类时,是否将成员相同类型的变量组合在一起?这样做有什么好处吗?例如:
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_;
.
.. };
或者您只是按照添加顺序添加它们?
答案 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)
答案 4 :(得分:1)
史蒂夫麦康奈尔的代码完成,p762: -
明智的订单声明:... 按类型分组通常是明智的,因为相同类型的变量倾向于用于相关操作 ......如果您的变量列表是这样的话 字母顺序有助于 你的日常工作可能太大了。
另外,在上一页中,他介绍了我之前回答的风格,显示多个声明“拥挤”到一行......
bool a_, b_, c_;
...带有“编码恐怖”图标。所以我正在重新考虑这种方法。感谢评论者让我重新评估这个。
答案 5 :(得分:0)
在大多数情况下,结构中不应包含太多成员。
如果你这样做,也许你应该考虑子结构......
我知道有例外,但作为一般经验法则,尽量保持结构小。
答案 6 :(得分:0)
按有效优先顺序排列:
0)IF成员在构造之间存在依赖关系或者如果成员需要按特定顺序构建:按照您希望被构建的构造顺序声明它们。在建设中,成员构建的唯一顺序是班级中的成员顺序。
0.5)如果类实例对象大小很重要(你想要这种类型的最小大小 - 但不要做早期优化!),对于一些编译器,最好按大小顺序订购你的成员,第一个大于字节对齐或编译时的其他类似行为。
1)首先优先考虑CLARITY:首先为读者写(明确,在主题/目的组中排序等),然后为编译器(可能遵循先前的建议)。
几乎在所有情况下,只有1)是重要的。首选主题,目的和“同一系统的组合”,用于按成员分组成员。
注意:如果您按系统对成员进行分组,并且您发现有很多组,那么您可能应该将这些系统封装在类中。
答案 7 :(得分:0)
我同意其他人关于对变量进行排序的一些原因,但除此之外,我希望看到对于类在开头附近运行最重要的变量,以及在结束时不太重要的变量。如果你有其他理由来覆盖这个,那很好,但是当其他事情失败时,那就是我所做的。
当然,这通常是通过按照它们发生的顺序声明变量来实现的。最重要的变量是我首先想到的变量,以及我在实际编写类实现时遇到的其他变量。