36

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

你更喜欢 C++ 中的哪种强制转换语法风格?

  • C 风格的强制转换语法:(int)foo
  • C++ 风格的强制转换语法:static_cast<int>(foo)
  • 构造函数语法:int(foo)

它们可能不会翻译成完全相同的指令(是吗?),但它们的效果应该是相同的(对吧?)。

如果您只是在内置数字类型之间进行转换,我发现 C++ 风格的转换语法过于冗长。作为一名前 Java 编码员,我倾向于使用 C 风格的强制转换语法,但我当地的 C++ 大师坚持使用构造函数语法。

你怎么看?

4

10 回答 10

58

最好不要使用 C 风格的强制转换,主要有以下三个原因:

  • 如前所述,这里不进行检查。程序员根本不知道使用了哪些削弱了强类型的类型转换
  • 新演员有意在视觉上引人注目。由于强制转换经常暴露代码中的弱点,因此有人认为在代码中显示强制转换是一件好事。
  • 如果使用自动化工具搜索演员表尤其如此。可靠地找到 C 风格的演员表几乎是不可能的。

正如 palm3D 所指出的:

我发现 C++ 风格的强制转换语法太冗长了。

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

构造函数语法(正式名称:function-style cast)在语义上与C-style cast 相同,并且出于同样的原因也应避免使用(声明时变量初始化除外)。即使对于定义自定义构造函数的类型,这是否应该也是有争议的,但在 Effective 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构造函数。

于 2008-08-28T13:16:18.267 回答
15

根据Stroustrup的说法:

引入“新式转换”是为了让程序员有机会更清楚地表达他们的意图,并让编译器捕捉更多错误。

所以真的,它是为了安全,因为它会进行额外的编译时检查。

于 2008-08-28T13:07:28.523 回答
7

关于这个主题,我遵循Scott Meyers提出的建议(更有效的 C++,第 2 项:首选 C++ 风格的演员表)。

我同意 C++ 风格转换是冗长的,但这就是我喜欢它们的地方:它们很容易被发现,并且它们使代码更易于阅读(这比编写更重要)。

它们还迫使您考虑需要什么样的演员表,并选择正确的演员表,从而减少出错的风险。它们还将帮助您在编译时而不是在运行时检测错误。

于 2008-08-28T13:19:32.160 回答
3

我使用 static_cast 有两个原因。

  1. 很清楚正在发生什么。我无法在没有意识到正在进行演员表的情况下阅读该内容。使用 C 风格的演员表,您的眼睛可以毫不停顿地从它上面经过。
  2. 在我的代码中搜索我正在投射的每个地方都很容易。
于 2008-08-28T13:16:29.983 回答
3

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

于 2008-08-28T13:17:26.207 回答
3

构造函数语法。C++ 是面向对象的,构造函数存在,我使用它们。如果您觉得需要对这些转换 ctor 进行注释,您应该对每种类型都进行注释,而不仅仅是内置类型。也许您对转换 ctor 使用了 'explicit' 关键字,但客户端语法完全模仿了内置类型的 ctor 语法。令人印象深刻,这可能是真的,但是输入更多字符使搜索变得容易,这真是令人惊讶。为什么将这些视为特殊的?如果您正在编写具有大量 int/unsigned/... 的数学公式,往返于 double/float - 图形 - 并且您每次都需要编写 static_cast,那么公式的外观会变得杂乱无章并且非常难以阅读。无论如何,这是一场艰苦的战斗,因为很多时候你会在没有注意到你的情况下转换。

于 2016-12-23T14:48:58.503 回答
1

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

于 2008-08-28T13:04:20.573 回答
1

C-style cast 是最糟糕的方法。它更难看,难以辨认,将不应该混为一谈的不同动作混为一谈,并且不能做 C++ 风格的强制转换可以做的所有事情。他们真的应该从语言中删除 C 风格的演员表。

于 2008-08-28T13:11:10.433 回答
1

我们目前在任何地方都使用 C 风格的强制转换。我问了另一个铸造问题,我现在看到了使用 static_cast 的优势,如果没有其他原因,只是它是“greppable”(我喜欢这个词)。我可能会开始使用它。

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

于 2008-08-28T13:30:28.360 回答
1

选择 C++ 风格,更糟糕的是,包含 C++ 显式类型转换的丑陋冗长代码片段将不断提醒我们都知道的事情(即显式转换是不好的——导致咒骂的产生)。如果您想掌握跟踪运行时错误的艺术,请不要使用 C++ 风格。

于 2012-02-26T21:18:30.953 回答