与 Regular cast vs. static_cast vs. dynamic_cast 相关的问题:
您更喜欢 C++ 中的哪种类型转换语法风格?
- C 风格转换语法:
(int)foo
- C++ 风格的转换语法:
static_cast<int>(foo)
- 构造函数语法:
int(foo)
它们可能不会翻译成完全相同的指令(是吗?),但它们的效果应该是相同的(对吧?)。
如果您只是在内置数字类型之间进行转换,我发现 C++ 风格的转换语法过于冗长。作为一名前 Java 编码员,我倾向于使用 C 风格的强制转换语法,但我本地的 C++ 大师坚持使用构造函数语法。
你怎么看?
最佳答案
最佳实践从不使用 C 风格的强制转换,主要有以下三个原因:
- 如前所述,此处不执行任何检查。程序员根本不知道使用了哪些削弱了强类型的类型转换
- 新 Actor 阵容有意引人注目。由于强制转换经常暴露代码中的弱点,因此有人认为在代码中显示强制转换是一件好事。
- 在使用自动化工具搜索类型转换时尤其如此。可靠地找到 C 风格的转换几乎是不可能的。
正如 palm3D 所说:
I find C++-style cast syntax too verbose.
出于上述原因,这是故意的。
构造函数语法(正式名称:函数样式转换)在语义上与 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++ 强制转换语法样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168/