在C ++中使用init列表后的大括号放置

时间:2009-01-10 16:10:13

标签: coding-style

对于任何放置牙箍的人:

void f() {
    stuff();
}

您希望在长初始化列表后放置大括号? 同样的方式?

Object::Object()
    : foo(1)
    , bar(2) {
    stuff();
}

或者设置一个例外,以便您实际看到init列表的结束位置?

Object::Object()
    : foo(1)
    , bar(2)
{
    stuff();
}

或留空?

Object::Object()
    : foo(1)
    , bar(2) {

    stuff();
}

或者可能是一个奇怪的混合体?

Object::Object()
    : foo(1)
    , bar(2)
    {
    stuff();
}

或滥用缩进

Object::Object()
: foo(1)
, bar(2) {
    stuff();
}

Object::Object() : foo(1)
                            , bar(2) {
    stuff();
}

在这个小例子中,所有人都很漂亮,但是有十几个初始化器和一个中等长度的功能体,这很快就会发生变化。

6 个答案:

答案 0 :(得分:4)

能够检测ctor-initializer列表的开始/结束位置以及代码块开始/结束的位置似乎很重要。

Object::Object ()
  : foo (1)
  , bar (2)
{
  ...
}

答案 1 :(得分:2)

我希望一次尽可能多地在屏幕上显示代码,这样我的眼睛就可以尽可能少地滚动来回跳跃。当然,有一个限制。一旦我开始需要为一条线内的某些东西寻找太多的东西,我已经达到了收益递减的程度。如果我没有初始化超过3或4个字段,我通常会这样做。

Object::Object() : foo(1), bar(2) {
    stuff();
}

如果我需要初始化很多字段,它往往看起来像这样。

Object::Object() : foo(1), 
                   bar(2),
                   baz(3) {
    stuff();
}

答案 2 :(得分:0)

我猜大多数开发人员都喜欢与他们的括号格式保持一致,以及他们如何在其余代码中使用它。读取不是你自己风格的括号格式是很困难的。尝试破译混合格式会使您的程序对您不熟悉的代码更难以理解。

答案 3 :(得分:0)

我把开口支架放在一个新线上。结果看起来大多像第二个例子,但没有初始化器的缩进。

也就是说,因为这似乎是C ++在实践中具有最广泛布局的部分,我个人已经回到初始化构造函数中的变量(仍然有效),以避免冒犯任何人。 / p>

答案 4 :(得分:0)

我承认在我做的很多事情上全局不一致,这意味着我没有一个全局括号方法,相反,每个语言构造都可能有我自己使用的括号方法。

 function()
 {
 }

 control-flow () {
 } else {
 }

 type name {
 };

由于构造函数是一个函数...

 foo::foo()
  : bar(1)
  , baz(2)
 {
 }

答案 5 :(得分:0)

这是我的风格:

Object::Object()
        : foo(1),
          bar(2) {

    // First line here.
}

它与我的支架风格保持一致,但也在初始化器和代码之间建立了视觉分离。