it-swarm.cn

C样式转换或C ++样式转换

那么,您使用什么呢?

int anInt = (int)aFloat;

要么

int anInt = static_cast<int>(aFloat);
// and its brethren

而且,更重要的是,为什么?

21
bastibe

首先,请了解这些行不等价

int* anInt = (int*)aFloat; // is equivalent to

int* anInt = reinterpret_cast<int*>(aFloat); 

这里发生的是程序员正在要求编译器尽一切可能进行转换。

区别很重要,因为使用static_cast只会要求将“安全”的基本类型转换为,而reinterpret_cast将转换为任何类型的基本类型,可能只是将所需的内存布局映射到给定对象的内存上。

因此,由于“过滤器”不同,因此如果您依赖编译器(或者如果使用dynamic_cast则是运行时隐含的)来告诉您在哪里做错了,则使用特定的类型转换比使用C类型的转换更加清晰和安全。 ,请避免C强制转换和reinterepret_cast。

既然更清楚了,那么还有另一件事:static_cast,reinterpret_cast,const_cast和dynamic_cast更易于搜索

最终点是:他们很丑。想要的。潜在的错误代码,代码气味,明显的“技巧”(可能会产生错误)在与丑陋外观关联时更易于跟踪。 错误代码应难看.

“是设计使然”。并使开发人员知道他可以在哪里做得更好(如果不需要,可以完全避免强制转换),并且可以,但可以通过“标记”为丑陋的形式在代码中“记录”。

引入新型强制转换的第二个原因是C强制转换很难在程序中发现。例如,您无法使用普通的编辑器或文字处理器方便地搜索演员表。 C型演员表的这种近乎不可见的情况尤其不幸,因为它们具有潜在的破坏性。 丑陋的操作应具有丑陋的句法形式。这种观察是选择新样式转换语法的一部分原因。另一个原因是新型强制转换必须与模板符号匹配,以便程序员可以编写自己的强制转换,尤其是运行时检查的强制转换。

也许是因为static_cast太丑陋且很难键入,所以您更可能在使用它之前三思而后行?那会很好,因为在现代C++中,强制转换实际上是可以避免的。

来源:Bjarne Stroustrup(C++创建者)

47
Klaim

C++强制转换更具限制性(因此,可以更好地表达您的意图,并简化代码审查等)。如果需要,它们也更容易搜索。

37
Bruce Stephens

选项C:“ C++样式”的强制转换,因为它与结构没有区别:

int anInt = int(aFloat);

甚至:

int anInt(aFloat);

除此之外,除了这些琐碎的带有原语的情况(众所周知)之外,我更喜欢使用x_cast <>而不是C样式的强制类型转换。原因有以下三个:

  • 它们更狭义地定义了程序员试图执行的操作。

  • 他们可以执行C样式强制转换无法执行的操作(尤其是在dynamic_cast <>的情况下,它可以跨多继承链的分支进行交叉转换)。

  • 它们是。他们大声宣布程序员正在对类型系统进行操作。在这种情况下,这是的事情。

13
Kaz Dragon

我有一些有关C/C++样式转换的规则:

  1. 取消使用const必须总是使用const_cast。出于明显的原因。不幸的是,我关于取消使用const导致键盘伸出并打断程序员手指的规则未获批准。
  2. 程序员在接触到任何东西时所掌握的任何位操纵样式的恶作剧都应使用reinterpret_cast。这确实是C所没有的强制类型转换:假装此整数的位实际上是浮点数的位。这样可以避免(int)(*(int*)(&floatVar))
  3. 如果您输入“ dynamic_cast”,停止并重新评估您的多态类层次结构和设计。继续重新评估类层次结构的设计,直到您可以删除这些单词。
  4. 不用担心static_cast

#4背后的理由很简单,那就没关系。不符合其他规则的情况是显而易见的,或者是非常低级的。易于理解的简单类型(如int到float)的转换不需要特殊的语法。而且,如果您陷入某物的深沉,丑陋的胆量中,那么,您就会陷入某物的深沉,丑陋的胆量中。无需引起注意“这里有龙”这一事实,因为牙齿,爪子和火几乎已经把它放走了。

7
Nicol Bolas

如果用C编写代码,请使用C强制转换。如果使用C++编写,请使用C++强制转换。

尽管大多数强制转换会破坏适当的类型安全性,但C++的限制性更强,因此与C强制转换相比,类型不安全性要少一些。

我可以容忍使用(T *)NULL的人,尽管可以强制过载。

7
CashCow

如上述文章所述,C++(静态)强制转换在实践中更安全一些。

查找有关不同类型的转换及其优点和缺点的更多信息可能是明智的。

只是为了更多地了解为什么。 。

http://zh.wikipedia.org/wiki/Static_cast

http://en.wikipedia.org/wiki/Dynamic_cast

http://zh.wikipedia.org/wiki/Reinterpret_cast

4
the JinX

这实际上取决于我使用的是哪种语言,因为您知道他们说的是什么:在罗马说罗马。因此,如果我使用C进行编程,我会尽量使用C功能,但是如果我使用C++进行编程,那么我会继续使用C++功能,即使有些人不喜欢这种方法,因为他们说这使代码“不太容易移植”,我说我不在乎,我使用C++和C++进行编程,并且我需要一个完全与C++兼容的编译器来编译代码,否则我将使用其他不同的东西首先。

3
Coyote21

由于在模板中使用C样式转换时出现了问题,因此发明了static_cast等。如果您正在编写模板,或者以后将代码转换为模板,则最好使用C++样式的强制转换。原因是因为C++样式转换更好地表达了意图,所以在C样式转换将执行错误的操作(给定特定类型的模板参数)的情况下,它们将提供预期的结果。

除此之外,我说如果您有一个特定的问题需要C++样式的强制转换-dynamic_cast是最常见的,但是即使那样也不是每天都会发生的。

除此以外,C风格的转换可能会稍微混乱一些,并有助于提高可读性,或者也许不取决于当今读者对这种转换样式的熟悉程度。在我看来,这并不是很重要,主要是个人喜好,尽管有些人不喜欢C风格也不要感到惊讶。

最后说明-如果您需要大量转换,这很重要,那么您可能在做其他错误。在某些情况下有例外,但是大多数高级代码不需要很多(如果有的话)强制类型转换。

3
Steve314