是否有理由更喜欢static_cast<>而不是C风格强制转换?它们相等吗?速度有什么不同吗?
当前回答
Static_cast在编译时检查转换是否在明显不兼容的类型之间进行。与dynamic_cast相反,在运行时不检查类型兼容性。而且,static_cast转换并不一定安全。
Static_cast用于从指向基类的指针转换为指向派生类的指针,或在原生类型之间转换,例如enum转换为int型或float转换为int型。
static_cast的用户必须确保转换是安全的。
c风格的强制转换不执行任何检查,无论是在编译时还是在运行时。
其他回答
由于存在许多不同类型的强制转换,每种类型都具有不同的语义,因此static_cast<>允许您说“我正在进行从一种类型到另一种类型的合法转换”,例如从int型到double型。简单的c风格强制转换可能意味着很多事情。你在上/下选角吗?你是在重新解释指针吗?
c++样式转换由编译器检查。C风格强制转换在运行时不会失败,也可能失败。
此外,c++样式转换可以很容易地搜索到,而c样式转换则很难搜索到。
另一个很大的好处是,4种不同的c++风格类型转换更清楚地表达了程序员的意图。
在写c++的时候,我几乎总是使用c++风格,而不是C风格。
参见c++强制转换操作符的比较。
但是,对各种不同的强制转换操作使用相同的语法可能会使程序员的意图不明确。 此外,在大型代码库中很难找到特定类型的强制转换。 对于只需要简单的转换的情况,c风格强制转换的通用性可能太过了。在几个不同功能程度的强制转换操作符之间进行选择的能力可以防止程序员无意中强制转换为不正确的类型。
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
Static_cast在编译时检查转换是否在明显不兼容的类型之间进行。与dynamic_cast相反,在运行时不检查类型兼容性。而且,static_cast转换并不一定安全。
Static_cast用于从指向基类的指针转换为指向派生类的指针,或在原生类型之间转换,例如enum转换为int型或float转换为int型。
static_cast的用户必须确保转换是安全的。
c风格的强制转换不执行任何检查,无论是在编译时还是在运行时。
推荐文章
- Uint8_t不能用cout打印
- c++中不必要的花括号
- 如何反转一个c++向量?
- 如何开始开发Internet Explorer扩展?
- Std::auto_ptr改为Std::unique_ptr
- int的最大值
- c++中有最大数组长度限制吗?
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 字符串不能识别为有效的日期时间“格式dd/MM/yyyy”
- 如何在Go中使用c++
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 将varchar字段的类型更改为整数:"不能自动转换为整数类型"