一个相关问题 普通演员对比static_cast 对比动态转换:

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

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

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

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

你怎么认为?

有帮助吗?

解决方案

这是最佳实践 绝不 使用 C 风格的强制转换有以下三个主要原因:

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

正如 palm3D 所指出的:

我发现 C++ 风格的转换语法过于冗长。

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

构造函数语法(正式名称:函数式转换)在语义上是 相同 出于同样的原因,与 C 风格的强制转换一样,也应该避免(声明时的变量初始化除外)。即使对于定义自定义构造函数的类型来说,这是否应该成立也是有争议的,但在《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 构造函数。

其他提示

根据 斯特鲁斯特鲁普:

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

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

关于这个主题,我遵循以下建议 斯科特·迈耶斯 (更有效的 C++, ,第 2 项:更喜欢 C++ 风格的强制转换)。

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

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

我使用 static_cast 有两个原因。

  1. 正在发生的事情一目了然。我无法读完这篇文章而不意识到正在演员阵容中。使用 C 型石膏,您的视线可以毫不停顿地直接经过它。
  2. 可以轻松搜索代码中要进行转换的每个位置。

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

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

C型演员阵容是最糟糕的选择。它更难看到,不可分割,合并了不应该合并的不同操作,并且不能完成 C++ 风格强制转换可以完成的所有操作。他们确实应该从语言中删除 C 风格的强制转换。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top