C ++强制转换语法样式

c++ coding-style casting

14243 观看

10回复

4069 作者的声誉

常规强制转换与static_cast与dynamic_cast有关的问题:

在C ++中,您更喜欢哪种转换语法样式?

  • C样式转换语法: (int)foo
  • C ++样式转换语法: static_cast<int>(foo)
  • 构造函数语法: int(foo)

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

如果只是在内置数字类型之间进行转换,我会发现C ++样式的转换语法太冗长。作为前Java编码器,我倾向于使用C样式强制转换语法,但是我的本地C ++专家坚持使用构造函数语法。

你怎么看?

作者: palm3D 的来源 发布者: 2008 年 8 月 28 日

回应 10


1

7342 作者的声誉

C样式强制转换语法,请勿进行错误检查。C ++样式的强制转换语法,进行一些检查。使用static_cast时,即使它不进行检查,至少您知道在此也要小心。

作者: CiNN 发布者: 2008 年 8 月 28 日

12

9619 作者的声誉

根据Stroustrup的说法:

引入了“新型强制转换”,使程序员有机会更清楚地陈述其意图,并使编译器捕获更多错误。

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

作者: hometoast 发布者: 2008 年 8 月 28 日

1

15337 作者的声誉

C样式转换是最糟糕的选择。很难看到,无法理解,将不应该合并的不同动作组合在一起,并且不能完成C ++样式转换可以执行的所有操作。他们确实应该从该语言中删除C样式的强制转换。

作者: DrPizza 发布者: 2008 年 8 月 28 日

50

417612 作者的声誉

决定

最好不要使用C样式转换,这是三个主要原因:

  • 如前所述,此处不执行检查。程序员根本不知道使用了哪种类型的转换会削弱强类型
  • 新的演员阵容在视觉上是有目的的。由于强制转换通常会揭示代码中的弱点,因此有人认为使强制转换在代码中可见是一件好事。
  • 如果使用自动化工具搜索演员表,则尤其如此。可靠地找到C型演员表几乎是不可能的。

如palm3D所述:

我发现C ++样式的转换语法太冗长。

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

构造函数语法(正式名称:函数样式转换)在语义上与 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构造函数。

作者: Konrad Rudolph 发布者: 2008 年 8 月 28 日

2

304471 作者的声誉

我使用static_cast有两个原因。

  1. 很明显正在发生什么。如果不了解是否正在进行强制转换,我将无法继续阅读。使用C型演员表时,您的视线可以不停地经过它。
  2. 在我要转换的代码中搜索每个位置都很容易。
作者: Bill the Lizard 发布者: 2008 年 8 月 28 日

2

15619 作者的声誉

绝对是C ++风格的。多余的输入将有助于防止您在不应该使用时进行转换:-)

作者: Ben Collins 发布者: 2008 年 8 月 28 日

5

16255 作者的声誉

关于此主题,我正在遵循Scott Meyers的建议更有效的C ++,第2项:更喜欢C ++样式的强制转换)。

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

他们还迫使您考虑需要哪种类型的演员,并选择正确的演员,以减少出错的风险。它们还将帮助您在编译时而不是在运行时检测错误。

作者: Jérôme 发布者: 2008 年 8 月 28 日

1

37473 作者的声誉

目前,我们到处都使用C样式转换。我问了另一个强制转换问题,现在我看到了使用static_cast的好处,如果不是因为它是“可抓取的”(我喜欢这个术语),就别无他法了。我可能会开始使用它。

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

作者: Graeme Perrow 发布者: 2008 年 8 月 28 日

1

11 作者的声誉

追求C ++风格,更糟糕的是,构成C ++显式类型转换的丑陋冗长的代码片段将不断提醒着我们大家都知道的事情(即,显式转换很糟糕-导致造词的产生)。如果您想掌握跟踪运行时错误的技巧,请不要使用C ++风格。

作者: CAH 发布者: 2012 年 2 月 26 日

1

2618 作者的声誉

构造函数语法。C ++是OO,构造函数存在,我使用它们。如果您需要注释这些转换ctor,则应该对每种类型都进行注释,而不仅仅是内置类型。也许您将'explicit'关键字用于转换ctor,但客户端语法完全模仿内置类型的ctor语法。可以抓住,这可能是正确的,但是键入更多字符使搜索变得很容易,这是一个很大的惊喜。为什么将这些视为特殊?如果您要编写带有往返于double / float(图形)和int / float(图形)之间的int / unsigned / ...的数学公式,并且每次都需要编写static_cast,则该公式的外观会变得混乱并且非常难以理解。无论如何,这都是一场艰苦的战斗,因为很多时候您甚至都没有意识到自己会转变。

作者: QBziZ 发布者: 2016 年 12 月 23 日
32x32