与Regular cast vs. static_cast vs. dynamic_cast相关的问题:
您更喜欢C ++中的演员语法风格吗?
(int)foo
static_cast<int>(foo)
int(foo)
它们可能无法转换为完全相同的指令(是吗?)但它们的效果应该相同(对吧?)。
如果您只是在内置数值类型之间进行转换,我会发现C ++风格的转换语法过于冗长。作为一个以前的Java编码器,我倾向于使用C风格的转换语法,但我的本地C ++专家坚持使用构造函数语法。
您怎么看?
答案 0 :(得分:50)
最佳做法从不使用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)
答案 2 :(得分:5)
关于这个主题,我正在遵循Scott Meyers(More Effective C++,第2项:首选C ++风格的演员表)所做的建议。
我同意C ++样式演员是冗长的,但这就是我喜欢它们:它们很容易被发现,并且它们使代码更容易阅读(这比写作更重要)。
他们还会强迫你思考你需要什么样的演员阵容,并选择合适的演员阵容,降低犯错的风险。它们还可以帮助您在编译时检测错误,而不是在运行时检测错误。
答案 3 :(得分:2)
我使用static_cast有两个原因。
答案 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存在会这样做。