我听说static_cast函数应该优于c风格或简单函数风格的强制转换。这是真的吗?为什么?
当前回答
C样式强制转换在代码块中很容易被忽略。c++风格的类型转换不仅是更好的实践;它们提供了更大程度的灵活性。
Reinterpret_cast允许整型到指针类型的转换,但是如果使用不当可能是不安全的。
Static_cast为数值类型提供了良好的转换,例如从enum到int或从int到float或任何您确定类型的数据类型。它不执行任何运行时检查。
另一方面,Dynamic_cast将执行这些检查,标记任何不明确的赋值或转换。它只对指针和引用起作用,会产生开销。
还有一些其他的,但这些是你会遇到的主要的。
其他回答
Static_cast除了操作指向类的指针外,还可以用于执行类中显式定义的转换,以及执行基本类型之间的标准转换:
double d = 3.14159265;
int i = static_cast<int>(d);
C样式强制转换在代码块中很容易被忽略。c++风格的类型转换不仅是更好的实践;它们提供了更大程度的灵活性。
Reinterpret_cast允许整型到指针类型的转换,但是如果使用不当可能是不安全的。
Static_cast为数值类型提供了良好的转换,例如从enum到int或从int到float或任何您确定类型的数据类型。它不执行任何运行时检查。
另一方面,Dynamic_cast将执行这些检查,标记任何不明确的赋值或转换。它只对指针和引用起作用,会产生开销。
还有一些其他的,但这些是你会遇到的主要的。
这与您希望施加的类型安全性有关。
当你写(bar) foo(如果你没有提供类型转换操作符,这相当于reinterpret_cast<bar> foo)时,你是在告诉编译器忽略类型安全,只做它被告知的事情。
当您编写static_cast<bar> foo时,您是在要求编译器至少检查类型转换是否有意义,并且对于整型类型,要插入一些转换代码。
编辑2014-02-26
这个答案是我5年前写的,但我错了。(见注释)。但它仍然得到了赞!
问题不仅仅是使用static_cast<>还是c风格强制转换,因为使用c风格强制转换时会发生不同的事情。c++强制转换操作符的目的是使这些不同的操作更加显式。
从表面上看,static_cast<>和c风格的强制类型转换似乎是一回事,例如,当将一个值强制转换为另一个值时:
int i;
double d = (double)i; //C-style cast
double d2 = static_cast<double>( i ); //C++ cast
这两个函数都将整数值转换为double类型。然而,当使用指针时,事情变得更加复杂。一些例子:
class A {};
class B : public A {};
A* a = new B;
B* b = (B*)a; //(1) what is this supposed to do?
char* c = (char*)new int( 5 ); //(2) that weird?
char* c1 = static_cast<char*>( new int( 5 ) ); //(3) compile time error
在这个例子中(1)可能没问题,因为A指向的对象实际上是b的一个实例,但如果你不知道在代码中A实际上指向什么呢?
(2)可能是完全合法的(您只想查看整数的一个字节),但它也可能是一个错误,在这种情况下,一个错误将是很好的,如(3)。
c++强制转换操作符旨在通过在可能的情况下提供编译时或运行时错误来暴露代码中的这些问题。
因此,对于严格的“值强制转换”,可以使用static_cast<>。如果你想运行时对指针进行多态转换,请使用dynamic_cast<>。如果真的想忘记类型,可以使用reintrepret_cast<>。而要将const抛出窗外,有const_cast<>。
它们只是让代码更明确,这样看起来你知道你在做什么。
Static_cast意味着您不能意外地使用const_cast或reinterpret_cast,这是一件好事。
推荐文章
- 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字段的类型更改为整数:"不能自动转换为整数类型"