C++ 强制转换语法样式

标签 c++ coding-style casting

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/

相关文章:

coding-style - 处理超过 2 个可能的返回值?

c# - 转换为 Tuple<object,object>

java - 无法从 Map<String,Object> 转换为 Map<String,List<Map<String,String>>>

javascript - JS_WrapObject 的作用是什么?

c++ - bash : ./main.o 无法执行二进制文件 Exec 格式错误

c++ - 我如何处理客户端断开连接(epoll)

NOLINT 的 java checkstyle 等价物

c++ - undefined reference 错误消息 - C++

c# - OO 设计 - 您在内部使用公共(public)属性还是私有(private)字段?

c - C中的指针,不明白他们是如何得到这个结果的