在C++中,<double>static_cast(a)和双(a)之间有什么区别?
In C++, what are the differences between static_cast<double>(a) and double(a)?
两者有什么区别
int a;
// a gets some value
double pi = static_cast<double>(a)/3;
和
int a;
// a gets some value
double pi = double(a)/3;
你见过后者吗?在我看来,我在Stroustrup写的一些片段中看到过它,但我找不到参考。
有人可能认为他们是在构建而不是铸造。 考虑:
some_fun(std::string("Hello"));
许多人认为他们在那里调用构造函数,而实际上他们正在做 C 风格的转换。 碰巧的是,强制转换将在它查看的一长串其他内容中查看目标类型的构造函数,因此在这里它最终会调用构造函数。
函数符号转换具有与其他类型的 C 转换相同的所有缺点:
- 可以无意中抛弃恒常性
- 可以无声地变成重新演绎的演员阵容
- 很难用greping工具区分。
除此之外,在这两种情况下,您都在执行完全相同的操作。
后者被称为显式强制转换的功能表示法,您明确表示a
应被视为double
。 使用此技术,您几乎可以将任何内容转换为任何类型。
前者是在C++中强制转换类型的首选方法。 它执行基本检查以查看要强制转换为的类型是否有意义(指向基类指针的子类指针等)。 此外,如所示示例所示,您可以执行隐式转换。 从技术上讲,示例中的static_cast
是显式的,但操作(赋值)的结果是隐式的。
static_cast<double> (a)
和 (double) a
之间生成的汇编代码没有区别。(type_id) cast_expression
,强制转换符号的主要优点是它更灵活。在一种情况下,它可能相当于一个const_cast
,在另一种情况下,一个static_cast
,在另一种情况下,一个dynamic_cast
,在另一种情况下,const_cast
和static_cast
(或dynamic_cast
)的组合。
这种优势也是弱点。铸造符号在不同的地方意味着不同的东西。另一个缺点是 很容易找到xxx_cast<type_id> (cast_expression)
.只需搜索_cast
.很难找到使用强制转换表示法的表达式。
使用static_cast是一种安全的C++式方式,但是(双重) - 不安全的旧C式方式。
看这里: 类型转换
int a;
//This is the old way of converting a variable from its type to a double
double pi = double(a)/3;
//This is the new way of converting a variable from its type to a double
double pi = static_cast<double>(a)/3;
摘自沃尔特·萨维奇(Walter Savitch)的书,(用CPP解决问题,第10版)第222页
- C++我需要了解在哪里使用指针和双指针
- 如何在C++中的同一函数中使用字符串和双精度
- 我想知道长双倍和双倍之间的区别
- 结构和双指针隐藏在其他结构中,多层混淆
- 函数重载和双精度和长之间的混淆
- 浮点数和双精度之间的区别
- NaN 在浮点型和双精度型之间的类型转换
- 指针数组(*a)[]和双指针** a之间的差异
- Xcode 错误:指针和双精度之间的比较
- 提升::精神(气)在浮点和双倍之间做出决定
- 双指针和它们之间的括号
- x86和x86_64中浮点和双精度之间的性能差异
- 如何在 c++ 中生成介于 0 和变量之间的随机双精度
- 在C++中,<double>static_cast(a)和双(a)之间有什么区别?
- 在 STL 堆栈和双端格式之间进行转换
- 单指针数组和双指针数组之间的区别
- 在浮点和双精度之间进行选择
- 大整数和双精度之间的乘法
- FlasCC:Vector 之间的互操作。<Number> 和双倍[]
- 在编译时在浮点数和双精度之间切换