C ++演员语法样式

时间:2008-08-28 13:01:42

标签: c++ coding-style casting

Regular cast vs. static_cast vs. dynamic_cast相关的问题:

您更喜欢C ++中的演员语法风格吗?

  • C风格的演员语法:(int)foo
  • C ++ - 样式转换语法:static_cast<int>(foo)
  • 构造函数语法:int(foo)

它们可能无法转换为完全相同的指令(是吗?)但它们的效果应该相同(对吧?)。

如果您只是在内置数值类型之间进行转换,我会发现C ++风格的转换语法过于冗长。作为一个以前的Java编码器,我倾向于使用C风格的转换语法,但我的本地C ++专家坚持使用构造函数语法。

您怎么看?

10 个答案:

答案 0 :(得分:50)

最佳做法从不使用C风格的演员表有三个主要原因:

  • 如前所述,此处不进行检查。程序员根本无法知道使用哪种强化打字的各种演员
  • 新演员有意在视觉上引人注目。由于强制转换经常在代码中显示出弱点,因此有人认为在代码中显示强制转换是件好事。
  • 如果使用自动工具搜索演员表,则尤其如此。可靠地找到C风格的演员阵容几乎是不可能的。

正如palm3D所说:

  

我觉得C ++风格的演员语法太冗长了。

由于上述原因,这是故意的。

构造函数语法(官方名称:function-style cast)在语义上与C样式转换相同,也应该避免(除了声明中的变量初始化),对于它原因。即使对于定义自定义构造函数的类型,这是否应该是真的存在争议,但在有效C ++中,Meyers认为即使在这些情况下你也应该避免使用它们。举例说明:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

此处的static_cast实际上会调用auto_ptr构造函数。

答案 1 :(得分:12)

根据Stroustrup

  

引入了“新式演员阵容”   给程序员一个陈述的机会   他们的意图更清楚,更明确   编译器捕获更多错误。

实际上,它是为了安全,因为它会进行额外的编译时检查。

答案 2 :(得分:5)

关于这个主题,我正在遵循Scott MeyersMore Effective C++,第2项:首选C ++风格的演员表)所做的建议。

我同意C ++样式演员是冗长的,但这就是我喜欢它们:它们很容易被发现,并且它们使代码更容易阅读(这比写作更重要)。

他们还会强迫你思考你需要什么样的演员阵容,并选择合适的演员阵容,降低犯错的风险。它们还可以帮助您在编译时检测错误,而不是在运行时检测错误。

答案 3 :(得分:2)

我使用static_cast有两个原因。

  1. 明确清楚发生了什么。如果没有意识到有一个演员正在进行,我无法阅读。使用C风格的演员阵容,你可以毫不犹豫地直接穿过它。
  2. 我可以轻松搜索我正在投射的代码中的每个位置。

答案 4 :(得分:2)

绝对是C ++风格。额外的打字将有助于防止您在不应该进行投射时: - )

答案 5 :(得分:1)

C风格的强制转换语法,不要进行错误检查。 C ++ - 样式转换语法,做一些检查。 当使用static_cast时,即使它没有进行检查,至少你知道你应该在这里小心。

答案 6 :(得分:1)

C风格演员阵容是最糟糕的选择。更难以看到,不可纠正,混淆不应该混淆的不同行为,并且不能做C ++风格的演员可以做的所有事情。他们真的应该从语言中删除C风格的演员阵容。

答案 7 :(得分:1)

我们目前在各地都使用C风格的演员阵容。我问了另一个casting question,我现在看到使用static_cast的优势,如果没有其他原因,那就是“greppable”(我喜欢那个术语)。我可能会开始使用它。

我不喜欢C ++风格;它看起来太像函数调用了。

答案 8 :(得分:1)

转向C ++风格,更糟糕的是,包含C ++显式类型转换的丑陋冗长的代码片段将不断提醒我们所知道的内容(即显式转换是坏的 - 导致咒骂的成败) 。 如果您想掌握跟踪运行时错误的技巧,请不要使用C ++样式。

答案 9 :(得分:1)

构造函数语法。 C ++是OO,构造函数存在,我使用它们。 如果你觉得需要注释这些转换器,你应该为每种类型而不仅仅是内置类型。也许您对转换ctors使用'explicit'关键字,但客户端语法完全模仿内置类型的ctor语法。 可以使用,这可能是真的,但输入更多字符会让搜索变得容易,这真是一个惊喜。为什么把这些视为特殊? 如果你正在编写带有大量int / unsigned / ...和来自double / float - graphics的数学公式,并且你每次都需要编写一个static_cast,那么公式的外观会变得混乱并且非常难以理解。 无论如何,这是一场艰苦的战斗,因为很多时候你会在没有注意到你的情况下进行转换。 对于向下转换指针,我确实使用了static_cast,因为默认情况下没有ctor存在会这样做。